Перечисления и конструктор

126
17 января 2020, 09:20
public enum Apple {
    PIPO(1), BIBO(2), GITO(3);
    private int price; 
    Apple(int price){
        this.price = price;
    }
    int getPrice(){
        return price;
    }
}

   public class Test {
    public static void main(String[] args) {
        Apple apple1 = Apple.PIPO(2);
        System.out.println(apple1);
    }
}

В enum Apple определен конструтор и не пойму почему мы пишем сразу перечислениям данные в конструктор именно в ENUM, а не в другом месте при создании объекта допустим как мы это делаем с классами:

PIPO(1), BIBO(2) ... // в enum(e), а не вот ниже


 public class Test {
        public static void main(String[] args) {
            Apple apple1 = Apple.PIPO(2); //вот тут
            System.out.println(apple1);
        }
    }
Answer 1

Я так понимаю Вам не понятен сакральный смысл необходимости в таком инструменте как перечисления (enum), попробую пояснить.

Ваш пример из вопроса, с яблоками ценой, может немного запутать, т.к. цена это переменная в каком-то роде.

Лучше взять например цвета светофора в какой-то игре.

enum Color {
    RED, GREEN, YELLOW
}

Все компоненты определенного цвета - постоянная.

в 99% случаев Вам нет необходимости иметь 2 разных класса описывающих желтый цвет. В цветовой шкале rgb например желтый цвет будет представлен чем то вроде (255, 255, 0).

Соответственно наш enum будет иметь какой-то вид:

enum Color {
    RED(255, 0, 0), 
    GREEN(0, 255, 0), 
    YELLOW(255, 255, 0);
    int r;
    int g;
    int b;
    Color(int r, int g, int b){
        this.r = r;
        this.g = g;
        this.b = b;
    }
    ....
}

Экземпляры нашего перечисления Color будут созданы в момент загрузки класса, ClassLoader-ом и никогда не будут скушаны GarbageCollector-ом. И Обращаетесь вы к ним как по статической ссылке.

Color currentColor = Color.RED;

Как-то так, надеюсь Вам хоть чутка стало понятнее =)

READ ALSO
Какая технология лучшая для real-time messaging?

Какая технология лучшая для real-time messaging?

Пытаюсь написать программу клиент сервер которая будет оповещать клиентов о каких то событиях (например о новых сообщениях) между друг другомВ...

134
MVP Pattern Android для больших приложений

MVP Pattern Android для больших приложений

Пробую постигать MVP Pattern для Android приложенийСама суть, вроде, ясна, но для совсем небольших приложений, которые обычно и бывают в примерах

157
Нет ответа на POST запрос retrofit2

Нет ответа на POST запрос retrofit2

Пытаюсь реализовать REST клиент для андройдаPOST запрос не возвращает json ответ

132
Ошибка Spring не выводит страницу в браузере

Ошибка Spring не выводит страницу в браузере

Я написал проект на спринге который должен через JSP открывать страницу, и там выводит информацию из MySQL о студентах(имя, фамилия, фото) когда...

138