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

为什么我们允许在Java中引用枚举成员的枚举成员?,java,enums,Java,Enums,给定以下枚举: enum Repeat { Daily, Weekly, Yearly } 我意识到我们可以这样写: Repeat repeat = Repeat.Daily.Weekly.Yearly.Weekly; 这相当于: Repeat repeat = Repeat.Weekly; 我可以知道为什么允许使用这种语法吗?有没有办法让编译器警告我们不要这样做?枚举文本是静态成员,对于每个静态成员,可以使用类引用访问它们: TypeName.staticMemb

给定以下枚举:

enum Repeat {
    Daily,
    Weekly,
    Yearly
}
我意识到我们可以这样写:

Repeat repeat = Repeat.Daily.Weekly.Yearly.Weekly;
这相当于:

Repeat repeat = Repeat.Weekly;

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

枚举文本是静态成员,对于每个静态成员,可以使用类引用访问它们:

TypeName.staticMember
TypeName.staticMethod()
或在某个实例上:

new TypeName().staticMember
new TypeName().staticMethod()
不鼓励使用第二种方法(编译器将发出警告)

由于枚举文本只是静态成员,
Repeat.Daily.Weekly.Yearly.Weekly
与上面的第二个代码片段类似,它访问实例引用上的静态成员

对于类,这将是:

class Type {
    static Type INSTANCE1, INSTANCE2, INSTANCE3;
}

使用
Type.INSTANCE1.INSTANCE2.INSTANCE3
可以获得对
实例3
的引用。这是有效的,但它是不好的做法。

这是允许的,因为
每日、每周、每年
枚举中
默认值
静态字段,并保存
重复的对象。此外,您将从编译器
中得到一条警告:“静态字段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的字节码检查的一部分,从中可以清楚地看出
enum
变量是
静态的
,并且保存着enum本身的对象

   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 
0:new#1//classcom/java8/demo/Repeat
3:dup
4:ldc#14//String Daily
6:iconst_0
7:invokespecial#15//Method“”:(Ljava/lang/String;I)V
10:putstatic#19//每日字段:Lcom/java8/demo/Repeat;
13:new#1//class com/java8/demo/Repeat

Enum实例只是Enum类的
静态
实例

访问类的静态字段有两种方法:

  • 通过课堂本身:每天重复
  • 通过类实例:Repeat.Daily.Daily
  • 链接枚举时:

    Repeat repeat = Repeat.Daily.Weekly.Yearly.Weekly;
    
    这就像从类的实例中获取静态字段一样

    有没有办法让编译器警告我们不要这样做

    是,使用良好的IDE并打开警告。这样,在编写代码时,甚至在编译之前,您都会收到通知

    例如,在中,它被称为“对静态成员的非静态访问”:


    有没有办法让编译器警告我们不要这样做?
    您应该对此进行配置。