Java Enum

java1.5+引入Enum,这样就可以将一类有共性的定义,放在一起,也容易被调用。不用在CommonConstants中定义public static final *****

不过Enum编译后的文本也是public static final *****这种形式。

个人的理解:Enum中定义的常量有点像定义的类,Enum的类名就如同类的集合一样,不带参数时,就如同默认的不带参的构造器一样。

      带参时,就需要带参构造器。因枚举是一种常量定义,因此需要全大写。

public enum FruitEnum {
    APPLE, PEAR, ORANGE, GRAPE;
    // 可写可不写,默认的
    private FruitEnum() {
    }
}

带参的形式:

public enum FruitEnum {
    APPLE("苹果", "西安"), PEAR("梨子", "山西"), ORANGE("橘子", "广元"), GRAPE("葡萄", "吐鲁番");
    /** 水果名字 **/
    private String fruitName;
    /** 产地 **/
    private String place;
    // 带参时必须写
    private FruitEnum(String fruitName,String place) {
        this.fruitName = fruitName;
        this.place = place;
    }
    
    public String getFruitName() {
        return fruitName;
    }
    public void setFruitName(String fruitName) {
        this.fruitName = fruitName;
    }
    public String getPlace() {
        return place;
    }
    public void setPlace(String place) {
        this.place = place;
    }
    
}

 调用方法:

System.out.println(FruitEnum.GRAPE.getFruitName());
System.out.println(FruitEnum.GRAPE.getPlace());

 实际编译后的文本:

  因反编译软件无法看到内部的参数结构,只能通过点击class看结构,从这个结构可以看出每个常量实际都是重新new FruitEnum。

     34  new FruitEnum [1]
     37  dup
     38  ldc <String "ORANGE"> [36]
     40  iconst_2
     41  ldc <String "橘子"> [37]
     43  ldc <String "广元"> [39]

但是在switch调用内部内容时报出 case expressions must be constant expressions:错误无法编译通过 

要求switch的内容必须是final才可以。因此只能调用枚举。可以通过switch的内容先反找到枚举,再进行case..when。

原文地址:https://www.cnblogs.com/DennyZhao/p/8397477.html