Почему перечисления не приводят к бесконечным рекурсиям? - PullRequest
0 голосов
/ 19 июня 2019

В java перечисления объявляются следующим образом:

enum Fruits{
BANANA,
ORANGE,
APPLE
}

В этом примере объявленные перечисления имеют тот же тип, что и класс.Итак, когда я создаю экземпляр перечисления Fruits:

Fruits example = Fruits.ORANGE

, это означает, что создается экземпляр перечисления фруктов, который затем создает экземпляры для каждого перечисления.Учитывая, что каждое перечисление в фруктах относится к типу фруктов, которые они используют для создания новых экземпляров ... и так далее, приводящих к бесконечной рекурсии.Я что-то упустил?

Ответы [ 2 ]

6 голосов
/ 19 июня 2019
enum Fruits{
BANANA,
ORANGE,
APPLE
}

- это то же самое, что и

class Fruits{
  static final Fruits BANANA = new Fruits("BANANA", 0);
  static final Fruits ORANGE = new Fruits("ORANGE", 1);
  static final Fruits APPLE = new Fruits("APPLE", 2);

  private Fruits(String name, int ordinal) {
    super(name, ordinal);
  }
}

с небольшим количеством вспомогательного материала.Попробуйте декомпилировать класс enum (например, с помощью javap), и вы увидите, что это так.

Таким образом, когда вы пишете:

Fruits example = Fruits.ORANGE

, вы не создаете новыйэкземпляр класса: вы просто ссылаетесь на статическое поле.

0 голосов
/ 19 июня 2019

Но помните, что, поскольку они являются синглетонами, изменение атрибутов поля одного типа изменяет все «экземпляры» этого поля.

    enum Fruit {
       APPLE, ORANGE;
       private String color = "red";

       public String getColor() {
          return color;
       }

       public void setColor(String color) {
          this.color = color;
       }
    }


    Fruit apple = Fruit.APPLE;
    Fruit otherApple = Fruit.APPLE;


    System.out.println(apple.getColor()); // prints red
    System.out.println(otherApple.getColor()); // prints red

    apple.setColor("green");  // change apples color

    System.out.println(pple.getColor());  // prints green
    System.out.println(otherApple.getColor()); // prints green

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