enum
是一种数据类型,是一个预约义的常量汇合;enum 的常量 (即实例) 都是 public, static, final
的;常见的例子有:罗盘方向 (NORTH, SOUTH, EAST and WEST);每一个 enum 实例都是一个类;
enum
类能够蕴含办法,当创立一个 enum 类的时候编译器会主动增加一些办法,例如:动态的办法 values()
,返回蕴含所有常量的数组;toString()
办法将一个 enum 实例转化为一个 string;静态方法 valueOf(String)
依据给定的字符串获取对应的 enum
实例,例如:Level.valueOf("HIGH")
获取 Level.HIGH
;
enum
隐式继承 java.lang.Enum
,所以 enum 不能再继承其余类;enum 也不能创建对象 (new);
public enum Level { HIGH, MEDIUM, LOW}public class EnumTest { Level level; public EnumTest(Level level) { this.level = level; } public void test() { switch (level) { case HIGH : ...; break; case MEDIUM : ...; break; case LOW : ...; break; default : ...; } } public void iteration() { for (Level level : Level.values()) { System.out.println(level); } /* print: HIGH MEDIUM LOW */ }}
enum
能够蕴含字段,每一个常量都能够取得这些字段;在定义常量时,必须将字段值提供给 enum
的构造函数,构造函数的拜访修饰符必须是 private
,如果省略,默认为 private
,这是为了避免其余类创立新的常量;
public enum Level { HIGH (3), //calls constructor with value 3 MEDIUM(2), //calls constructor with value 2 LOW (1) //calls constructor with value 1 ; // semicolon needed when fields / methods follow private final int levelCode; Level(int levelCode) { this.levelCode = levelCode; } public int getLevelCode() { return this.levelCode; }}...Level level = Level.HIGH;System.out.println(level.getLevelCode()); // print 3
enum
能够蕴含字段,每一个常量都能够取得这些字段;在定义常量时,必须将字段值提供给 enum
的构造函数,构造函数的拜访修饰符必须是 private
,如果省略,默认为 private
,这是为了避免其余类创立新的常量;
public enum Level { HIGH (3), //calls constructor with value 3 MEDIUM(2), //calls constructor with value 2 LOW (1) //calls constructor with value 1 ; // semicolon needed when fields / methods follow private final int levelCode; Level(int levelCode) { this.levelCode = levelCode; } public int getLevelCode() { return this.levelCode; }}...Level level = Level.HIGH;System.out.println(level.getLevelCode()); // print 3
为什么要用 enum?
当想要示意一个固定汇合的常量时,应该应用 enum
:
- 进步可读性,代码更简洁;比如说
switch
语句,我要判断是哪种颜色,enum
类型的话就能够间接用RED
,BLUE
这种英文,如果不是枚举类型就得用整形数字 1,2,3; - 应用 enum 减少了编译时查看,避免了打错字的景象呈现,比方应用 enum 的话少打一个字母编译器就会报错,而应用 int 的话打多一个数字编译器不会报错;
- enum 的初始化是线程平安的,一个 enum 实例直到被应用的时候才会被单个线程结构初始化;
参考资料:
http://tutorials.jenkov.com/j...