Изменения

Перейти к: навигация, поиск

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

198 байт убрано, 00:17, 23 марта 2021
Наследование в enum
==Предыстория==
Программируя, мы часто сталкиваемся с необходимостью ограничить множество допустимых значений для некоторого типа данных. Так, например, день недели может иметь 7 разных значений, месяц в году - 12, а время года - 4. Для решения подобных задач во многих языках программирования со статической типизацией предусмотрен специальный тип данных - перечисление <tex>(enum)</tex>.
Данный тип данных появился в Java начиная с версии 1.5. (enum) предоставляет множество удобств как в компактности записи, так и в удобстве использования. Так же, по сравнениюв отличие, допустим, с от C++, перечисления в Java представляют собой полноценные объекты, что предоставляет разработчику гораздо большую гибкость.
==Введение ==
==Конструкция enum==
Начнем с примера. Давайте опишем с помощью enum тип данных для хранения оценки студентамер длины:
enum Unit { KILOMETER, METER, MILLIMETER }
METER {
public double getLength() { return 1; }
}; ,
MILLIMETER {
public double getLength() { return 0.001; }
•MILLIMETER - объект 3-го класса производного от Unit
Два производных класса будут созданы с полиморфным методом Object parse(String) и конструктором Unit(..., boolean). При этом объекты Объекты классов KILLOMETER, MILLIMETER и METER существуют в единственном экземпляре и доступны статически. В этом можно убедится:
System.out.println(Unit.class);
System.out.println(Unit.KILOMETER.getClass() + " " + Unit.KILOMETER.getClass().getSuperclass());
Результат будет следующим:
class Unit
class Unit ''$''1 class Unit class Unit ''$''2 class Unit class Unit ''$''3 class Unit
==Использование enum==
===Переключение с enum===
Рассмотренные ранее примеры являются довольно простыми, но перечислимые Перечислимые типы предлагают значительно больше. Перечислимые значения, которые можно очень удобно использовать для итерации и в операторах <tex>switch</tex>, имеют большое значение.
Для сравнения значения unit с разными возможными мерами длин можно использовать следующую запись:
unit.equals(Unit.METER)
Но множество сравнений заняло бы много места.
Для этого мы используем <tex>switch</tex>, в результате чего у нас получится получается следующая запись:
switch (unit) {
}
В результате чего он выведет выдаст соответствующую оценкумеру длины. Так же можно употребить <tex>default </tex>, на тот случай, если вдруг другой программист добавил новые значения в Unit, а вас не предупредил. Поставив для варианта <tex>default </tex> вывод сообщения об отсутствии в списке значенияя значения unit, вы обнаружите это изменение.
===Получение елемента элемента enum по строковому представлению его имени===
Довольно часто возникает задача получить элемент enum по его строковому представлению. Для этих целей в каждом enum-классе компилятор автоматически создает специальный статический метод: public static EnumClass valueOf(String name), который возвращает элемент перечисления EnumClass с названием, равным name. Пример использования:
String name = "METER";
==Коллекции перечислимых типов==
В Java использование генериков generics в enum запрещено. Но можно использовать EnumMap и EnumSet.
===EnumSet===
EnumSet<T> EnumSet.copyOf(EnumSet<T> s) - Создает EnumSet содержащий те же элементы.
EnumSet<T> EnumSet.complementOf(EnumSet<T> s) - Создает EnumSet с тем же типом данных как и у указанного EnumSet, но содержащий элементы не входящие в указанный набор.
EnumSet<T> EnumSet.noneOf(T.class) - Создает пустой EnumSet, но сразу определяет для него тип используемых в нем данных в последующей работе с ним.
EnumSet<T> EnumSet.of(e1, e2, e3...) - Создает EnumSet, первоначально содержащий указанные элементы.
EnumSet<T> EnumSet.range(from, to) - Создает EnumSet, первоначально содержащий все элементы в диапазоне от первого указанного элемента до второго указанного элемента.
===EnumMap===
EnumMap - это специализированный класс Map, для работы с Enum. В EnumMap все происходит аналогично. Все Эллементы должны быть из единственного перечислимого типа. Эллементы так же хранятся в их естественном порядке(порядок в котором хранятся элементы в Enum константыклассе). И Так же не доступен нулевой эллемент, попытки вставить его бросят NullPointerExceptionException.  Создание EnumMap :
Рассмотрим примеры создания EnumMap<K,V>(K.class) EnumMap<K,V>(EnumMap<K,V>) EnumMap<K,V>(Map<K,V>):
Методы EnumMap соответствуют методам <K,V>(K.class) - создает пустой EnumMap, и определяет для него тип хранящихся ключей. EnumMap<K,V>(EnumMap<K,V>) - создает EnumMap являющийся копией данного. EnumMap<K,V>(Map<K,V>) - создает EnumMap, инициализируемую по данной Map.
==Пример==
Анонимный участник

Навигация