java - 为什么我们允许在 Java 中引用枚举成员的枚举成员?

标签 java enums

给定以下枚举:

enum Repeat {
    Daily,
    Weekly,
    Yearly
}

我意识到我们可以这样写:

Repeat repeat = Repeat.Daily.Weekly.Yearly.Weekly;

相当于:

Repeat repeat = Repeat.Weekly;

我可以知道为什么允许这样的语法吗?有没有办法让编译器警告我们不要这样做?

最佳答案

这是允许的,因为 Daily、Weekly、Yearlyenumdefaultstatic 字段,并且保存 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/

相关文章:

java - 如何使用 JPA 和 Hibernate 为 2 个表建立单向 @oneToMany 关系

java - Google Collection 和 Google Guava 在 Shrinkwrap-resolver 上的交叉依赖问题

Java找不到父包中的类

php - MySQL 查询获取枚举值并将其写入下拉列表

c# - 通用枚举到 SelectList 扩展方法

C#:将一个枚举包装在另一个枚举中(即镜像另一个枚举/复制它......)

java - 从字节转换为字符串的任何其他逻辑

java - Apache Beam::无法使用 java session 窗口进行 groupbykey 工作

c++ - typedef 一个现有的枚举类型,可能吗?

c# - IEnumerable<Enum> 的扩展方法?