我正在努力学习枚举以更好地理解它们。从Java文档中,我获取了以下信息:
“枚举类型是一种特殊的数据类型,使变量成为预定义常量的集合。”
对我来说,这听起来非常像final变量。
那么,真正的区别是什么呢?在何时使用其中之一?枚举只是一组final变量吗?
enum
。public enum MuEnum {
FIRST("First"), SECOND("Second");
private String value;
MyEnum(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
考虑以下例子:
public void myMethod(MyEnum parameter) { .. }
MyEnum
的值(FIRST
或SECOND
),如果你的方法签名为:public void myMethod(String parameter) { .. }
当你有一个像 enum
的枚举时
public enum MyEnum {
FIRST_COSTANT, SECOND_CONSTANT;
}
public class /* enum */ MyEnum extends Enum<MyEnum> {
private Enum() {}
public final static MyEnum FIRST_CONSTANT = new MyEnum() {};
public final static MyEnum SECOND_CONSTANT = new MyEnum() {};
... // methods
}
因此,在这个意义上,它们是相同的。
这在Java语言规范这里中有解释。
除了从枚举类型E继承的成员之外, 对于每个名为n的已声明枚举常量,枚举类型都有一个隐式声明的公共静态常量字段n,类型为E。这些字段被认为是按照相应的枚举常量的顺序声明的,在枚举类型中明确声明的任何静态字段之前。每个这样的字段都被初始化为与其对应的枚举常量。每个这样的字段也被认为带有与相应枚举常量相同的注释。当初始化相应的字段时,枚举常量被创建。
有一个很大的区别:首先,enum
不是变量,而是类型。一个 final
变量,比如说一个 int
,可以有一个单一的、预设值,在众多可能的 int
值中选择一个,而 enum
变量 (也可以是 final
) 可以从您在定义 enum
时声明的集合中选择一个值。
这里是一个例子:
enum Color {Red, Green, Blue;}
上面的声明并没有定义一个变量。它定义了一组值,如果您选择声明一个Color
类型的变量,它就可以拥有这些值:
Color backgroundColor = Color.Red;
Color
。它的值可以改变,但必须是enum
定义的三个值之一。enum
。您也可以使用一个或多个final
变量 - 实际上,在enum
被引入之前这种做法已经很常见。例如,Java的Calendar
类使用static final int
常量表示日期的各个部分,其中enum
可能效果更好。// This...
final int FIRST = 0;
final int SECOND = 1;
// Is roughly equivalent to this.
enum Ordering = { FIRST, SECOND };
Ordering
枚举命名了一个新类型,您可以创建一个接受Ordering
而不是int
的函数。这确保在编译时避免意外传递超出边界值(例如2)到期望Ordering
的函数中。void foo(Ordering order) {;}
foo(FIRST); // This works
foo(3); // This causes an error at compile time
当你知道一个类型会有多少实例时,就可以使用枚举。是的,在引入枚举之前,使用静态的 final 变量。
枚举提供了一些简单静态 final 变量所没有的优点: