现在我想弄清楚java中的Enum到底是什么.我知道它们是如何工作的以及如何/何时使用它们但是我对它们究竟是什么有点不清楚.基于他们的行为,在我看来,他们只不过是一个私有构造函数的类.然而,在我看来,编译器正在对它们做一些特殊的事情,因为Enums有一个特殊的方法values(),它不会出现在Oracle doc站点的Enum类中.
我的问题是,Enums究竟是什么以及编译器如何解释它们?
如前所述,An enum是一个继承自Enum类的类(a)private构造函数; (b)命名的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();
}
Run Code Online (Sandbox Code Playgroud)
...你可以想象编译器生成这样的东西:
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...
}
}
Run Code Online (Sandbox Code Playgroud)
还有其他一些enum特别之处:
enums有一个固定的实例列表.如果switch没有case处理每个值的语句,这允许它执行诸如发出警告之类的操作.ordinal()值.(换句话说,第一个具有序数0,然后第二个具有序数1,依此类推.)这允许创建非常有效的基于阵列的数据结构EnumMap.我确定我错过了一些东西,但这是一个很好的起点.
| 归档时间: |
|
| 查看次数: |
221 次 |
| 最近记录: |