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

当只识别最后一个枚举时,为什么Java允许引用两个(或更多)枚举?,java,enums,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); } pu

我偶然发现了这一点,想知道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);
    }
}
正如预期的那样,本周的产出是星期五

如果我这样更改代码:

public class EnumTest {

    public static void main(String[] args) {

        methodThatDoesSomething(Days.FRIDAY.MONDAY);
    }

    public static void methodThatDoesSomething(Days day){

        System.out.println(day);
    }
}
这个的输出是星期一

我还收到警告:

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

但它仍然编译并运行


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

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

Days.FRIDAY.MONDAY
就像

Days.MONDAY
但是,从非静态引用而不是应该从静态引用访问星期一
这就是警告的原因,代码按预期工作,但不是您真正要求的

Days.FRIDAY.MONDAY
就像

Days.MONDAY
但是,从非静态引用而不是应该从静态引用访问星期一
这就是发出警告的原因,这不是枚举的问题,只是关于任何静态成员,不幸的是,通过该类型的表达式也是有效的。最常见的例子是:

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,这里也不会出现null指针异常,尽管奇怪的是,生成的代码在完全忽略Foo.X之前仍然访问Foo.X。就好像写着:

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

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

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

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,这里也不会出现null指针异常,尽管奇怪的是,生成的代码在完全忽略Foo.X之前仍然访问Foo.X。就好像写着:

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

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

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

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


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

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

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


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

如果使用Days.MONDAY,则没有警告。仅当引用了两个或多个枚举(如Days.FRIDAY.MONDAY或Days.FRIDAY.周二.MONDAY.Yep)时,我才会收到警告。那正是我所说的。星期一是静止的,好的。星期五是星期二。星期一是非静止的,不太好。我明白了。更重要的是,天、星期五、星期二、星期一是非静态的。我的印象是,但也许我错了,在我的enum声明中:公共enum日{星期一、星期二、星期三、星期四、星期五、星期六、星期日}所有7天都是隐式静态的。这就是为什么我对这个错误感到惊讶。如果使用Days.MONDAY,则没有任何警告。仅当引用了两个或多个枚举(如Days.FRIDAY.MONDAY或Days.FRIDAY.周二.MONDAY.Yep)时,我才会收到警告。那正是我所说的。星期一是静止的,好的。星期五是星期二。星期一是非静止的,不太好。我明白了。更重要的是,天、星期五、星期二、星期一是非静态的。我的印象是,但也许我错了,在我的enum声明中:公共enum日{星期一、星期二、星期三、星期四、星期五、星期六、星期日}所有7天都是隐式静态的。这就是为什么我对这个错误感到惊讶。