现在我正试图弄清楚java中的枚举到底是什么。我知道它们是如何工作的以及如何/何时使用它们,但是我有点不清楚它们到底是什么。根据他们的行为,在我看来,他们只不过是一个带有私有构造函数的类。然而,在我看来,编译器对它们做了一些特别的事情,因为 Enums 有一个特殊的方法values()
,它没有出现在 Oracle 文档网站上的 Enum 类中。
我的问题是,枚举到底是什么,编译器如何解释它们?
现在我正试图弄清楚java中的枚举到底是什么。我知道它们是如何工作的以及如何/何时使用它们,但是我有点不清楚它们到底是什么。根据他们的行为,在我看来,他们只不过是一个带有私有构造函数的类。然而,在我看来,编译器对它们做了一些特别的事情,因为 Enums 有一个特殊的方法values()
,它没有出现在 Oracle 文档网站上的 Enum 类中。
我的问题是,枚举到底是什么,编译器如何解释它们?
An是一个从具有(a)构造函数enum
的类继承的类,如您所提到的;(b) 命名实例的固定列表。Enum
private
final
在幕后,当你声明一个enum
:
public enum Foo {
A(1) {
public void bar() {
System.out.println("A#bar");
}
},
B(2) {
public void bar() {
System.out.println("B#bar");
}
},
C(3) {
public void bar() {
System.out.println("C#bar");
}
};
private Foo(int x) {
// Code goes here...
}
public abstract void bar();
}
...您可以想象编译器会生成如下内容:
public class Foo extends Enum<Foo> {
public static final Foo A=new Foo(1) {
public void bar() {
System.out.println("A#bar");
}
};
public static final Foo B=new Foo(2) {
public void bar() {
System.out.println("B#bar");
}
};
public static final Foo C=new Foo(3) {
public void bar() {
System.out.println("C#bar");
}
};
private Foo(int x) {
// Code goes here...
}
}
还有一些其他的东西让enum
s 变得特别:
enum
s 有一个固定的实例列表。switch
如果 a没有case
处理每个值的语句,这允许它执行诸如发出警告之类的操作。ordinal()
值分配给它。(换句话说,第一个具有序数 0,然后第二个具有序数 1,依此类推。)这允许EnumMap
创建非常有效的基于数组的数据结构。我确定我遗漏了一些东西,但这是一个很好的起点。