Почему мы разрешаем ссылаться на член enum члена enum в Java? - PullRequest
0 голосов
/ 26 мая 2018

Учитывая следующее перечисление:

enum Repeat {
    Daily,
    Weekly,
    Yearly
}

Я понимаю, что мы можем написать это так:

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

, что эквивалентно:

Repeat repeat = Repeat.Weekly;
* 1009Могу ли я знать, почему такой синтаксис разрешен?Можно ли позволить компилятору предупредить нас об этом?

Ответы [ 4 ]

0 голосов
/ 26 мая 2018

Есть ли способ, чтобы компилятор предупреждал нас об этом?

Да, используйте хорошую IDE и включите предупреждение.Таким образом, вы будете уведомлены, как только вы напишите код, прежде чем вы даже скомпилируете его.

Например, Eclipse , он называется «Нестатический доступ к статическому члену»:

enter image description here

0 голосов
/ 26 мая 2018

Это разрешено, поскольку Daily, Weekly, Yearly - это поле static, default внутри enum и содержит объект 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 
0 голосов
/ 26 мая 2018

Экземпляр Enum - это просто static экземпляр класса enum.

У нас есть два способа получить доступ к статическому полю класса:

  1. Через класс itselft: Repeat.Daily
  2. Через экземпляр класса: Repeat.Daily.Daily

Когда вы объединяете ваше перечисление:

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

Это похоже на получение статического поля из экземпляракласса.

0 голосов
/ 26 мая 2018

Литералы Enum являются статическими членами, и с каждым статическим членом можно получить к ним доступ, используя ссылку на класс:

TypeName.staticMember
TypeName.staticMethod()

Или в экземпляре:

new TypeName().staticMember
new TypeName().staticMethod()

Второйтакой подход не рекомендуется (и компилятор выдаст предупреждение)

Поскольку литералы enum являются просто статическими элементами, Repeat.Daily.Weekly.Yearly.Weekly подобен второму фрагменту кода выше, получая доступ к статическим членам по ссылкам на экземпляры.

С классом это будет:

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

И можно получить ссылку на INSTANCE3, используя Type.INSTANCE1.INSTANCE2.INSTANCE3.Это верно, но это плохая практика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...