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。