枚举
Java Enum是一种特殊的Java类型,用于定义常量集合。更确切地说,Java枚举类型是一种特殊的Java类。枚举可以包含常量,方法等。Java枚举是在Java 5中添加的。
枚举示例
下面是一个简单枚举实例:
public enum Level {
HIGH,
MEDIUM,
LOW
}
注意用来代替class或interface的enum关键字。enum是枚举类型的关键字。
你可以引用上面的枚举常量,如下所示:
Level level = Level.HIGH;
请注意,level变量的类型是Level枚举类型。 level变量可以拥有Level枚举常量中的一个值(HIGH,MEDIUM或LOW)。上面代码level的是HIGH。
在if语句使用枚举
由于Java枚举是常量,你通常需要将指向enum常量的变量与枚举类型中的可能常量进行比较。以下是在if语句中使用Java枚举的示例:
Level level = ... //赋予枚举常量集合中的一个值
if( level == Level.HIGH) {
} else if( level == Level.MEDIUM) {
} else if( level == Level.LOW) {
}
这段代码将level变量与Level枚举中每个可能的枚举常量进行比较。
如果其中一个枚举值的出现次数多于其他值,那么在第一个if语句中检查该值将会有更好的性能,因为平均执行的比较较少。尽管这不是一个很大的区别,除非比较执行很多。
在switch语句中使用枚举
如果你的枚举类型包含很多常量,并且需要根据值来检查变量,那么使用Java switch语句可能是个更好的办法。
你可以像这样在switch语句中使用枚举:
Level level = ... //赋予枚举常量集合中的一个值
switch (level) {
case HIGH : ...; break;
case MEDIUM : ...; break;
case LOW : ...; break;
}
将...其替换为如果level变量与给定的Level常量值匹配要执行的代码。代码可以是一个简单的Java操作,也可以是一个方法调用等。
枚举迭代
你可以通过调用其静态values()方法来获取Java枚举类型的所有可能值的数组。所有枚举类型都由Java编译器自动获取静态values()方法。以下是迭代枚举的所有值的示例:
for (Level level : Level.values()) {
System.out.println(level);
}
运行这个Java代码将打印出所有的枚举值。输出如下:
HIGH
MEDIUM
LOW
注意常量的名字是如何打印出来的。这是Java枚举不同于static final常量的一个地方。
枚举字段
你可以将字段添加到Java枚举中。然后,每个常量枚举值就获得一个字段。在定义常量时,必须将字段值提供给枚举的构造方法。这里是一个例子:
public enum Level {
HIGH (3), //调用构造方法,参数为3
MEDIUM(2), //调用构造方法,参数为2
LOW (1) //调用构造方法,参数为1
; // 字段与方法间需要分号分隔
private final int levelCode;
private Level(int levelCode) {
this.levelCode = levelCode;
}
}
注意上面例子中的Java枚举有一个int类型的构造方法。枚举构造方法设置int字段。当定义常量枚举值时,会将一个int值传递给枚举构造方法。
枚举构造方法必须是private的或包的范围(默认)。Java枚举不能使用public或protected的构造方法。
枚举方法
你也可以添加一个方法到枚举里面。示例如下:
public enum Level {
HIGH (3),
MEDIUM(2),
LOW (1)
;
private final int levelCode;
Level(int levelCode) {
this.levelCode = levelCode;
}
public int getLevelCode() {
return this.levelCode;
}
}
你可以通过引用其中一个常量值来调用enum方法。示例如下:
Level level = Level.HIGH;
System.out.println(level.getLevelCode());
这段代码将打印出值为3,这个值是枚举常量HIGH的levelCode字段的值。
不限于简单的getter和setter方法。你也可以创建基于枚举的字段值进行计算的方法常量。如果你的字段没有被声明为final,你甚至可以修改字段的值(尽管考虑到枚举应该是常量,这可能不是一个好主意)。
枚举杂项细节
Java枚举隐式扩展java.lang.Enum类,所以你的枚举类型不能扩展另一个类。
如果枚举包含字段和方法,则字段和方法的定义必须始终位于枚举中的常量列表之后。此外,枚举常量的列表必须以分号;结尾。
下一篇:注解