java - 为什么我们允许在 Java 中引用枚举成员的枚举成员?
问题描述
给定以下枚举:
enum Repeat {
Daily,
Weekly,
Yearly
}
我意识到我们可以这样写:
Repeat repeat = Repeat.Daily.Weekly.Yearly.Weekly;
这相当于:
Repeat repeat = Repeat.Weekly;
我可以知道为什么允许这样的语法吗?有没有办法让编译器警告我们不要这样做?
解决方案
这是允许的,就像内部Daily, Weekly, Yearly
的static
字段一样,并且包含 的对象。此外,您将收到来自编译器的警告。它类似于下面的代码行。default
enum
Repeat
"The static field Repeat.Weekly should be accessed in a static way"
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
并保存了枚举本身的对象。
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
推荐阅读
- windows - mouse_event / PostMessage 按键消息 - 与 GetKeyState() 不一致
- csv - JMeter 读取/写入 CSV 数据集配置
- javascript - 模拟时钟无法读取 null 的属性
- java - 为什么不推荐使用 IOUtils.close?
- python - 从变量传递参数 - Python
- python - 如何异步运行同一类的多个实例?
- html - 如何在 .cshtml 中获得这样的布局
- java - 如何从 Java 中的错误消息中去除 Oracle 错误代码?
- firebase - 获取“firebase.functions(app)”参数需要一个 FirebaseApp 实例或在 React-Native Firebase 中未定义
- typescript - TS2322:类型 'Foo | Bar' 不可分配给类型 'Foo & Bar'