1

我偶然发现了这一点,想知道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 应该以静态方式访问

但它仍然可以编译和运行。

任何可以使用这个多重枚举引用的例子都将不胜感激。

4

3 回答 3

9

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

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为 null,您也不会在这里得到空指针异常,尽管奇怪的是,生成的代码在完全忽略它之前仍然可以访问。Foo.X好像是这样写的:

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

基本上,这是 Java 语言设计中的一个错误步骤,现在修复它为时已晚——我们能做的最好的就是得到警告,然后修复代码以通过类名访问静态成员。

于 2013-04-10T11:28:53.873 回答
2

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

Days.FRIDAY.MONDAY

就像

Days.MONDAY

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

于 2013-04-10T11:28:51.733 回答
1

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

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

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

于 2013-04-10T11:30:03.980 回答