Как перечисления перечисляются во время компиляции и как создаются объекты - PullRequest
4 голосов
/ 24 декабря 2011
enum icecream {
    vanilla(100), strawberry(20);
    int price;

    icecream(int i) {
        price = i;
    }

}

Я немного озадачен тем, как объекты enum создаются во время компиляции

Я видел несколько примеров, когда они упоминали это так

public enum Flavor
{
    COFFEE, VANILLA, CHOCOLATE, STRAWBERRY, RUM_RAISIN, PEACH
}

Это переводится в (во время компиляции)

public final class Flavor
extends java.lang.Enum
{
    public static final Flavor COFFEE = new Flavor("COFFEE", 0);
    public static final Flavor VANILLA = new Flavor("VANILLA", 1);
    // ...
}

Ссылка: http://www.kdgregory.com/index.php?page=java.enum

Но как объекты, создаваемые, когда я передаю значение вместе с именем, вызывают у меня, что они просто выглядят как вызовы методов. E.x. vanilla (100) здесь для vanilla цена 100, но как она на самом деле создается? Я не получаю это вообще. Пожалуйста, помогите: (

Ответы [ 2 ]

1 голос
/ 24 декабря 2011

vanilla(100), strawberry(20) - это просто нотация java5 +.Во время компиляции он переводится в правильный код создания объекта:

public static final icecream vanilla = new icecream(100);
public static final icecream strawberry = new icecream(20);

Кстати, java-тип должен быть CamelCased, поэтому icecream должно называться IceCream.

1 голос
/ 24 декабря 2011

Перечисления считываются компилятором java как константы, но, в конечном счете, они реализованы как любые другие объекты (то есть они не являются специальными типами, такими как int / float / arrays, а скорее являются синтаксической оболочкой над чистым объектом-ориентированная языковая особенность).Таким образом, перечисления имеют конструкторы, которые вы можете переопределить, так что ваши статические перечисления имеют больше, чем просто имя.Это может быть очень полезно, например, если вы хотите, чтобы ваши перечисляемые значения имели несколько полей.

Например, у меня может быть перечисление Animal, где у каждого животного есть имя, а также количество ног:

public enum Animal{
 Dog(4), Baboon(2);

 public int legs;

 private Animal(int legs) {
   legs=legs;
 }
}

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

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