给定以下枚举:
enum Repeat {
Daily,
Weekly,
Yearly
}
我意识到我们可以这样写:
Repeat repeat = Repeat.Daily.Weekly.Yearly.Weekly;
相当于:
Repeat repeat = Repeat.Weekly;
我可以知道为什么允许这样的语法吗?有没有办法让编译器警告我们不要这样做?
最佳答案
这是允许的,因为 Daily、Weekly、Yearly
是 enum
内 default
的 static
字段,并且保存 Repeat
的对象。此外,您将收到来自编译器的警告“静态字段Repeat.Weekly 应以静态方式访问”
。它类似于下面的代码行。
class Foo{
public static Foo obj1 = new Foo();
public static Foo obj2 = new Foo();
public static Foo obj3 = new Foo();
}
Foo f = Foo.obj1.obj2.obj3; // will work fine but you will get a warning from the compiler.
这是 Repeat
枚举的字节码检查的一部分,从这里可以清楚地看出 Enum
变量是 static
并保存 Object枚举本身。
0: new #1 // class com/java8/demo/Repeat
3: dup
4: ldc #14 // String Daily
6: iconst_0
7: invokespecial #15 // Method "<init>":(Ljava/lang/String;I)V
10: putstatic #19 // Field Daily:Lcom/java8/demo/Repeat;
13: new #1 // class com/java8/demo/Repeat
关于java - 为什么我们允许在 Java 中引用枚举成员的枚举成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50546113/