Enum и константы в чем отличие?

281
20 июля 2021, 03:00

Старый способ имитации "перечисления":

public static final int TOM = 1;
public static final int JERRY = 1;
public static final int REX = 1;

Новое, перечисление:

public enum Names {
BOBBY, BILLY, SOFFIE
}

Так в чем отличие? Зачем сделали перечисления "Enum"?

Answer 1

Описание enum -- это, по сути дела, описание класса и одновременно фиксированного набора именованных объектов этого класса. Объекты этого класса могут обладать всеми атрибутами обычных объектов -- конструкторами, полями, методами. Конструкторы могут инициализировать внутренние состояния этих объектов, поля -- хранить их состояния, в том числе ссылки на какие-то более/менее сложные объекты, методы могут реализовать какую-то функциональность.

Так что перечисление -- это не просто набор значений, которые можно использовать в операторе switch, их возможности намного больше.

С помощью перечислений можно, например, описать набор команд GUI -- каждая команда может иметь состояние (разрешено/запрещено), текст, отображаемый в меню и зависящий от состояния, текст всплывающей подсказки, ссылку на объект, который выполняет команду и т. п. Другой пример -- описание колонок таблицы, с информацией о ширине колонки, о том, как форматировать данные в этой колонке и проч., или параметры, определяющие режим работы приложения.

Да вообще много разных применений может быть, во многих случаях, когда количество разных объектов какого-то типа известно заранее. Грамотное использование перечислений может сильно улучшить дизайн приложения. Так что использование их просто в качестве именованных констант -- далеко не главное их применение. Вот навскидку пример того, что можно делать с перечислениями:

    public class Test_enums_2 {
        static class EnumData {
            int intValue;
            String stringValue;
            EnumData(int intValue, String stringValue) {
                this.intValue = intValue; 
                this.stringValue = stringValue;
            }
            void setNewString(String s) { this.stringValue = s; }
            public String toString()    { return intValue + ": " + stringValue; }
            int calcSomething()         { return intValue * stringValue.length(); }
            // Anything else...
        }
        enum EnumExample {
            ENUM1_ITEM1(1, "Раз"),
            ENUM1_ITEM2(2, "Два"),
            ENUM1_ITEM3(3, "Три"),
            ENUM1_ITEM4(4, "Четыре");
            private EnumData data;
            private boolean enabled = true;
            EnumExample(int intValue, String stringValue) {
                data = new EnumData(intValue, stringValue);
            }
            public void setEnabled(boolean newValue) {
                enabled = newValue;
            }
            public void setString(String newValue) {
                data.stringValue = newValue;
            }
            public String getFullName() {
                if (!enabled)   return "Ничего не скажу. Запрещено";
                else            return data.toString(); 
            }
            public String getShortName() {
                return String.valueOf(data.intValue);
            }
            public int calculate() {
                return data.calcSomething();
            } 
        }
        public static void main(String[] args) {
            EnumExample.ENUM1_ITEM3.setEnabled(false);
            for (EnumExample item: EnumExample.values()) {
                System.out.format("%s: Short name: %s, full name: %s, calc: %s\n", 
                                    item, item.getShortName(), 
                                    item.getFullName(), item.calculate());
            }
            System.out.println();
            EnumExample.ENUM1_ITEM1.setString("Ку-ку");
            EnumExample.ENUM1_ITEM2.setEnabled(false);
            EnumExample.ENUM1_ITEM3.setEnabled(true);
            for (EnumExample item: EnumExample.values()) {
                System.out.format("%s: Short name: %s, full name: %s, calc: %s\n", 
                                    item, item.getShortName(), 
                                    item.getFullName(), item.calculate());
            }
        }
    }
READ ALSO
Убрать фон кнопки в Swing

Убрать фон кнопки в Swing

Как убрать фон кнопки так, чтобы осталось только одно изображение? Сама иконка 16x16

161
Как отсортировать список List<> в JAVA?

Как отсортировать список List<> в JAVA?

Вот есть код, который выводит список объектовМне нужно что бы он при выводе сортировался по названию поля

395
Паттерн Memento в java

Паттерн Memento в java

Такой нубовский вопросС помощью паттерна Memento (знаю что устарел но так по заданию) сделать так, чтоб при выходе из графического редактора,...

208
Не срабатывает next.Line

Не срабатывает next.Line

Есть такой метод

264