Задать вопрос
Arti-Jack
@Arti-Jack

Можно ли таким способом передавать аргументы в конструктор enum?

Сегодня на занятии по Java SE столкнулся с небольшой проблемой. Наткнулся на непонятный для меня синтаксис, читая интересную информацию про Enum`ы на сайте.

Начнем с того, что я уже знаю:

  1. Я знаю то, что такое Enum
  2. Я знаю так же то, что все переменные в Enum`е по дефолту объявлены как static final переменные
  3. Я знаю о том, что с помощью метода values() очень удобно их итерировать
  4. Еще мне известно то, что у Enum есть возможность переопределять методы с помощью анонимных классов.
    Например:
    public enum Books {
    
        DARK_TOWER {
            @Override
            public void info() {
                System.out.println("Dark Tower, autor - Stephen King");
            }
        },
    
        KTULHU {
            @Override
            public void info() {
                System.out.println("Ktulhu, autor - Govard Lovecraft");
            }
        };
    
        public abstract void info();
    
    }



(Если я в чем-то ошибся из вышеперечисленного, то сообщите мне об этом, пожалуйста)

Но есть пару вещей, которые мне никак не понять.

Во-первых, это вот такой вот синтаксис:

enum Type { 
    INT(true) { 
        public Object parse(String string) { return Integer.valueOf(string); } 
    }, 
    INTEGER(false) { 
        public Object parse(String string) { return Integer.valueOf(string); } 
    }, 
    STRING(false) { 
        public Object parse(String string) { return string; } 
    }; 
 
    boolean primitive; 
    Type(boolean primitive) { this.primitive = primitive; } 
 
    public boolean isPrimitive() { return primitive; } 
    public abstract Object parse(String string); 
}


Что вообще означают значения true и false в конструкторе(?) Enum`а?

Во-вторых, допустим, где-то в main`е у меня есть вот такой вот код:
Books b = Books.DARK_TOWER;
        switch (b) {
            case DARK_TOWER:
                Books.DARK_TOWER.info();
                break;
            case KTULHU:
                Books.KTULHU.info();
                break;
        }


Никак не могу понять, почему в case`е я не могу писать вот так: case Books.KTULHU: ...?
  • Вопрос задан
  • 423 просмотра
Подписаться 3 Оценить 1 комментарий
Решения вопроса 1
EugeneP2
@EugeneP2
Java Dev
Можно рассмотреть такой пример:
public enum A {
    AAA {
        public void i() {
            System.out.println("Hi AAA");
        }
    },

    BBB {        
        public void j() {
            System.out.println("Hi BBB");
        }
    },
    CCC;

    public static void main(String[] args) {
        System.out.println(A.AAA.getClass().getName());
        System.out.println(A.BBB.getClass().getName());
        System.out.println(A.CCC.getClass().getName());
    }
}


Получаем:
com.home.A$1 - анонимный класс
com.home.A$2 - анонимный класс
com.home.A

т.е. создано 3 файла *.class

В конечном итоге, сам класс А - финальный и его нельзя расширять, но чтоб enum-ы могли реализовывать абстрактные методы, интерфейсы и как в примере выше, можно предположить, что внутри JVM разрешено наследоваться от enum-а.

UPD01:
После декомпиляции класс "A$1.class" с помощью javadecompilers, получаем код, который подтверждает догадку насчет анонимных классов

static final class A
extends com.home.A {
    A(String string2, int n2) {
        super(string, n, null);
    }

    public void i() {
        System.out.println("Hi AAA");
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы