为什么当只识别最后一个时,Java允许引用两个(或更多)枚举?

时间:2013-04-10 11:27:08

标签: java enums

我偶然发现了这一点,并且想知道java是否允许它。

以下是我的意思的样本:

public enum Days {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}

public class EnumTest {

    public static void main(String[] args) {

        methodThatDoesSomething(Days.FRIDAY);
    }

    public static void methodThatDoesSomething(Days day){

        System.out.println(day);
    }
}

这是FRIDAY的输出,正如预期的那样。

如果我更改代码:

public class EnumTest {

    public static void main(String[] args) {

        methodThatDoesSomething(Days.FRIDAY.MONDAY);
    }

    public static void methodThatDoesSomething(Days day){

        System.out.println(day);
    }
}

此输出为MONDAY

我也收到警告:

  

应以静态方式访问静态字段Days.MONDAY

但它仍在编译并运行。

可以使用多个枚举参考的任何示例都将非常感激。

3 个答案:

答案 0 :(得分:9)

这不是enums的问题 - 它只是任何静态成员(不幸的是)通过该类型的表达式有效。最常见的例子是:

Thread thread = new Thread(...);
thread.start();
thread.sleep(1000); // This doesn't do what it looks like

对于更接近原作的非枚举示例,它基本上是这样的:

class Foo {
   public static final Foo X = null;
   public static final Foo Y = new Foo();
}

public class Test {
    public static void main(String[] args) {
        Foo foo = Foo.X.Y;
    }
}

请注意,即使Foo.X为空,也不会在此处获得空指针异常,但奇怪的是,生成的代码 仍然访问Foo.X,然后才完全忽略它。就像它写的一样:

Foo ignored = Foo.X;
Foo foo = Foo.Y;

基本上,这是Java语言设计中的错误步骤,现在修复它已经太晚了 - 我们能做的最好的事情是获取警告,然后修复代码以通过类名访问静态成员。

答案 1 :(得分:2)

代码按预期工作,但不是你真正要求的。

Days.FRIDAY.MONDAY

就像

Days.MONDAY

但是应该从非静态引用而不是静态引用访问MONDAY (这就是警告的原因)

答案 2 :(得分:1)

枚举实际上是一个具有特殊语法糖的类,以使其使用更简单。

您实际上正在访问实际为Enum的Days实例,然后访问该实例的静态类成员。

因此,由于类层次结构和Java的类静态成员处理,这是可能的。