枚举类的使用场景

一个类的对象时有限且固定的。
使用枚举类的优点:
  更加直观、类型安全、利于表达

为什么不使用静态常量代替枚举类?如下

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

posted @ 2019-03-20 09:23  payn  阅读(667)  评论(0)    收藏  举报