繁体   English   中英

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

[英]Why do we allow referring to an enum member of an enum member in Java?

鉴于以下枚举:

enum Repeat {
    Daily,
    Weekly,
    Yearly
}

我意识到我们能够这样写它:

Repeat repeat = Repeat.Daily.Weekly.Yearly.Weekly;

这相当于:

Repeat repeat = Repeat.Weekly;

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

这是允许的,因为Daily, Weekly, Yearly都是enum defaultstatic字段,并保持Repeat的对象。 此外,您将收到编译器的警告"The static field Repeat.Weekly should be accessed in a static way" 它类似于下面的代码行。

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变量是static并且保存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 

枚举实例只是枚举类的static实例。

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

  1. 通过类itselft:Repeat.Daily
  2. 通过类的实例:Repeat.Daily.Daily

链接枚举时:

Repeat repeat = Repeat.Daily.Weekly.Yearly.Weekly;

就像从类的实例中获取静态字段一样。

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

是的, 使用一个好的IDE并打开警告。 这样,在编写代码之前,您将立即收到通知,然后再进行编译。

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

在此输入图像描述

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

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获取对INSTANCE3的引用。 这是有效的,但这是不好的做法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM