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

标签 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

我也收到警告:

The static field Days.MONDAY should be accessed in a static way

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

任何有关何时可以使用此多重枚举引用的示例都将不胜感激。

最佳答案

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

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 语言设计中的一个错误步骤,现在修复它为时已晚 - 我们能做的最好的事情就是收到警告,然后修复代码以通过类名访问静态成员。

关于java - 为什么 Java 在只识别最后一个时允许引用两个(或更多)枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15924566/

相关文章:

java - Maven - 如何通过命令行为java项目创建pom.xml

java - Android getSupportedPreviewSizes() on Camera 仅返回 3 个尺寸

typescript :使用在另一个文件中声明的枚举

java - 通过枚举值或其实现接口(interface)区分实现接口(interface)的对象实例

java - Jenkins Windows 安装程序将 java 放在哪里?

java - 使用 SOAPHandler 时 MTOM 不工作

java - 如何在 Spring Boot 中使用缓存来提高 OAuth2 ResourceServer 的性能

C++ 在枚举中使用 ASCII 而不是字母

objective-c - Objective-C 中的枚举定义形式

c# - 枚举应该以 0 还是 1 开头?