Java 中的成员enum
就像类的静态字段一样,因此a1.DOG
与Animals.DOG
.
public class EnumTest {
enum Animals { DOG, FISH, GOAT };
public void test(){
Animals a1 = Animals.DOG;
Animals a2 = a1.DOG; // the same as Animals.DOG, but makes code messy
Animals a3 = a1.DOG.FISH; // WTF chaining???
}
}
这不仅发生在enum
s 上,也发生在class
es 上:
public class A {
public static A a_1;
public static A a_2;
public void boo() {
A a = A.a_1;
A b = a.a_1; // That makes a equal to b!
A c = a.a_1.a_2; // I HATE "CHAINING" LIKE THIS
}
}
正如@lichengwu 在他/她的回答中指出的那样,enum
s 最终会编译成具有静态字段的类,所以这不是enum
s 的问题,而是类似于class
es 的问题。
在其他一些语言(例如 C#)中,不允许通过类型的实例引用类型的静态成员,但 Java 是一个例外。
恕我直言,通过类型的实例引用类型的静态成员应该是一个坏习惯。正如您所指出的,这会导致混乱。
如果您喜欢使用 Eclipse IDE,它只会给您一个警告:
静态字段 Animals.DOG 应该以静态方式访问
Eclipse 还为您提供了一些建议。其中之一是更改为使用类型来引用enum
成员,另一个是删除“字段的静态修饰符”(但实际上对 s 不起作用enum
)。
添加:
枚举编译为的内部结构:
final class Animals extends java.lang.Enum<Animals> {
public static final Animals DOG;
public static final Animals FISH;
public static final Animals GOAT;
public static Animals[] values();
public static Animals valueOf(java.lang.String);
static {};
}