枚举

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类,所以你的枚举类型不能扩展另一个类。

如果枚举包含字段和方法,则字段和方法的定义必须始终位于枚举中的常量列表之后。此外,枚举常量的列表必须以分号;结尾。

下一篇:注解

results matching ""

    No results matching ""