枚举类的使用场景
一个类的对象时有限且固定的。
使用枚举类的优点:
更加直观、类型安全、利于表达
为什么不使用静态常量代替枚举类?如下
public static final SEASON_SPRING =1;
1、类型不安全:类型不安全,如果一个方法要求传入季节参数,使用常量的话,传入的就是int类型的值。那么开发者可以传入任意的一个int类型的值。
2、没有命名空间:开发者需要使用SEASON_ 作为前缀来表达(为了更清晰的表达)。
关于枚举类
public enum SeasonEnum { SPRING,SUMMER,FALL,WINTER; }
1、使用snum定义的枚举类默认继承的是抽象类:java.lang.Enum,而不是Object类。可以实现一个或多个接口。
2、枚举类的所有实例(即该枚举类的实例)都必须放在第一行( ; 结尾)。不需要显式调用构造器。会自动调用 public static final修饰。
3、使用enu定义、非抽象的枚举类默认使用final修饰,不可被继承。
4、枚举类的构造器是私有的。
使用toString 方法,返回的就是对应实例的名称。
枚举类中也可以创建属性和方法
public enum SeasonEnum02 { SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天"); private final String name; private SeasonEnum02(String name) { this.name = name; } public String getName() { return name; } }
在第一行写枚举类的实例的时候,默认调用了构造器,因为使用的不是默认的无参构造,所以要创建有参构造并调用。
构造器需要定义成私有的,枚举类通常设计成不可变类,它耳钉Filed属性不应该被改变,这样会更加安全,代码更加简洁。
关于枚举类实现接口
枚举类可以实现一个或多个接口,实现接口的时候,需要实现接口中定义的所有的方法,如果没有全部实现的话,该枚举类就是抽象的,但是不需要显式地加上abstract修饰,系统会自己默认加上。
public enum Operation02{ PLUS{ public double eval(double x, double y) { return x + y; } }, MINUS{ public double eval(double x, double y) { return x - y; } }, TIMES{ public double eval(double x, double y) { return x * y; } }, DIVIDE{ public double eval(double x, double y) { return x / y; } }; public abstract double eval(double x, double y); }
-->Operation02实际上是抽象的,不可以创建枚举值。
-->所以这里申明枚举值的时候,都是先类抽象方法,是匿名内部类的实现。{...}是一个类体。
怎么使用:
public static void main(String[] args) { System.out.println(Operation02.PLUS.eval(10, 2)); System.out.println(Operation02.MINUS.eval(10, 2)); System.out.println(Operation02.TIMES.eval(10, 2)); System.out.println(Operation02.DIVIDE.eval(10, 2)); }
编译后的文件:
switch 语句中的表达式可以是枚举值
在没有枚举类的时候,我们要定义一个有限的序列,比如星期几,男人女人,春夏秋冬,一般会通过上面那种静态变量的形式,但是使用那样的形式如果需要一些其他的功能,需要些很多奇奇怪怪的代码。所以,枚举类的出现,就是为了简化这种操作。
可以将枚举类理解为是java的一种语法糖。
class Enum 中定义的方法
枚举类的实现原理:
编译反编译后的文件,如下
参考文章
https://blog.csdn.net/hellojoy/article/details/79883671

浙公网安备 33010602011771号