Запутанный способ, которым объекты сделаны в перечислениях - PullRequest
0 голосов
/ 09 сентября 2018

Посмотрев, как компилятор обрабатывает перечисления, и вы упомянули, что константы являются экземплярами, все это стало для меня гораздо более понятным. Однако у меня остался еще один вопрос.

public enum Weekday
{
  MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
} 

Компилятор компилирует его следующим образом;

class Weekday extends Enum
{
  public static final Weekday MONDAY  = new Weekday( "MONDAY",   0 );
  public static final Weekday TUESDAY = new Weekday( "TUESDAY ", 1 );
  public static final Weekday WEDNESDAY= new Weekday( "WEDNESDAY", 2 );
  public static final Weekday THURSDAY= new Weekday( "THURSDAY", 3 );
  public static final Weekday FRIDAY= new Weekday( "FRIDAY", 4 );
  public static final Weekday SATURDAY= new Weekday( "SATURDAY", 5 );
  public static final Weekday SUNDAY= new Weekday( "SUNDAY", 6 );

  private Weekday( String s, int i )
  {
    super( s, i );
  }

  //

В приведенном ниже примере я хотел бы объяснить свой последний вопрос: я видел такие фрагменты кода:

enum Test 
{
  EXAMPLE1(5), EXAMPLE2(6);

  private int number;

  Test(int number) {
    this.number = number;
  }

}

Test a = Test.EXAMPLE1;
System.out.println(a) outputs EXAMPLE1
System.out.println(a.number) outputs 5;

Теперь я путаюсь с выходными данными выше, когда объект, сохраненный в константе EXAMPLE1, создается следующим образом:

public static final Test EXAMPLE1  = new Test( "EXAMPLE1",   0 );

Поскольку, прежде всего, компилятор добавляет конструктор, и, если этот конструктор существует, как вызывается конструктор, который я определил?

private Test( String s, int i )
  {
    super( s, i );
  }

И во-вторых, даже если определенный мной конструктор каким-то образом вызывается, как это приводит к выводу EXAMPLE1, когда я говорю System.out.println (a)? Ни конструктор, который я определил, ни конструктор, добавленный компилятором, не добавляют значение значения EXAMPLE1 в любое поле объекта, хранящегося в константе EXAMPLE1. Так как это возможно, что System.out.println (a) выводит EXAMPLE1? Как это значение даже добавляется к объекту? Я не вижу ни одного конструктора, добавляющего это значение к объекту.

1 Ответ

0 голосов
/ 09 сентября 2018

Компилятор меняет ваш конструктор с:

Test(int number) {
    this.number = number;
}

до

private Test(String name, int ordinal, int number) {
    super(name, ordinal);
    this.number = number;
}

И вот почему это работает.

Вы можете проверить это, если хотите использовать инструмент javap:

javap -p -c -cp <directory> <package>.Test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...