Введение в программирование

Перечисления

Перечисления

Содержание

Как было раньше

  • Пример
    public final static int NEW = 1;
    public final static int RUNNING = 2;
    public final static int BLOCKED = 3;
    public final static int FINISHED = 4;
    
  • Проблемы
    • Нет проверки типов
    • Нет проверки уникальности
    • Плохая расширяемость
    • Малая информативность

Перечислимый тип

  • Пример
    public enum State {
        NEW,
        RUNNING,
        BLOCKED,
        FINISHED
    }
    
  • Каждое перечисление является независимой областью видимости

Идентификация переменных

  • Классом
    • Экземпляром
    • Именем
    • Номером
  • Имя
    • Идентификатор экземпляра
    • Метод name()
  • Номер
    • Присваивается автоматически
    • Метод ordinal()

Перечисления как классы

  • Перечисление может иметь
    • Закрытые конструкторы
    • Поля
    • Методы
    • Абстрактные методы, если они определены в каждом экземпляре
  • Перечисление может реализовывать интерфейсы

Пример. Меры длины (1)

public /*final*/ enum Unit {
    KILOMETER(1e3),
    METER(1),
    MILLIMETER(1e-3);
    private final double length;
    /*private*/ Unit(double length) {
        this.length = length;
    }
    public double getLength() {
        return length;
    }
}

Пример. Операции (1)

public enum Operation {
    ADD { double eval(double x, double y)
        { return x + y; } },
    SUBTRACT { double eval(double x, double y)
        { return x - y; } },
    MULTIPLY  { double eval(double x, double y)
        { return x * y; } },
    DIVIDE { double eval(double x, double y)
        { return x / y; } };
    abstract double eval(double x, double y);
}

Пример. Операции (2)

static double apply(
    Operation op,
    double x,
    double y
) {
    return op.eval(x, y);
}

Методы работы с перечислениями

  • Класс Enum – базовый для перечислений
  • Дополнительные
    • values() – все экземпляры
    • valueOf(name) – экземпляр по имени

Пример. Меры длины (2)

  • Вывод соотношений мер длины
    for (Unit u1 : Unit.values()) {
        for (Unit u2 : Unit.values()) {
            System.out.println(String.format(
                "There are %.1g %sS in one %s",
                u2.getLength()/u1.getLength(), u1, u2
            ));
        }
    }
    

Пример. Меры длины (3)

  • There are 1.0 KILOMETERS in one KILOMETER
    There are 0.0010 KILOMETERS in one METER
    There are 1.0e-06 KILOMETERS in one MILLIMETER
    There are 1.0e+03 METERS in one KILOMETER
    There are 1.0 METERS in one METER
    There are 0.0010 METERS in one MILLIMETER
    There are 1.0e+06 MILLIMETERS in one KILOMETER
    There are 1.0e+03 MILLIMETERS in one METER
    There are 1.0 MILLIMETERS in one MILLIMETER
    

switch и перечисления

  • Switch по перечислению
    • Метки ─ элементы перечисления
    • Можно опустить default
    • NullPointerException

Пример switch

Unit u = …
switch (u) {
    case KILOMETER:
        return "км";
    case METER:
        return "м";
    case MILLIMETER:
        return "мм";
}

Класс EnumSet

Класс EnumMap

Заключение

Содержание

Ссылки

Вопросы

???