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://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。