Перечисления создаются с использованием ключевого слова enum.
Скачать исходники для статьи можно ниже
Например, ниже показано простое перечисление сортов яблок:
// Перечисление сортов яблок, enum Apple { Jonathan, GoldenDel, RedDel, Winesap, Cortland }
Идентификаторы Jonathan, GoldenDel и так далее называются константами
перечисления. Каждая из них явно объявлена как открытый статический финальный член класса Apple. Более того, их тип — это тип перечисления, в котором они объявлены; в данном случае это Apple.
То есть в языке Java эти константы называются самотипизированными, причем само относится к окружающему перечислению.
Объявив перечисление, вы можете создавать переменные этого типа.
Однако даже несмотря на то, что перечисления определяют тип класса, вы не можете создавать объекты этого типа с помощью оператора new. Вместо этого вы объявляете и используете переменную перечисления почти таким же образом, как это делается с элементарными типами.
Например, ниже объявляется переменная ар перечислимого типа Apple.
Apple ар;
Поскольку переменная ар имеет тип Apple, присвоить ей можно только те
значения, которые определены в перечислении. Например, здесь переменной ар присваивается значение RedDel:
ар = Apple.RedDel;
Обратите внимание на то, что значению RedDel предшествует тип Apple.
Две перечислимые константы можно проверять на равенство с помощью оператора отношения ==.
Например, следующий оператор сравнивает переменную ар с константой Apple. GoldenDel:
if (ар == Apple.GoldenDel) // ...
Перечислимые значения также могут быть использованы в управляющей конструкции switch. Конечно же, все операторы case должны использовать константы из того же перечисления enum, что и выражение switch.
Например, следующий оператор switch абсолютно корректен.
// Использование enum для управления switch, switch(ар) { case Jonathan: // ... case Winesap: // ...
Обратите внимание на то, что в операторах case имена перечислимых констант используются без квалифицированного имени их типа перечисления. То есть применяется Winesap, а не Apple. Winesap.
Дело в том, что тип перечисления в операторе switch уже неявно задает тип перечисления для операторов case. Нет необходимости квалифицировать константы в операторах case именем типа их перечисления. Фактически попытка сделать это приведет к ошибке
компиляции.
Когда константа перечисления отображается, скажем, методом println(),
выводится ее имя. Например, следующая строка кода
System.out.println(Apple.Winesapp)
отобразит имя Winesapp.
Приведенная ниже программа собирает все вместе и демонстрирует применение перечисления Apple:
// Перечисление сортов яблок, enum Apple { Jonathan, GoldenDel, RedDel, Winesap, Cortland } class EnumDemo { public static void main(String args[]){ Apple ар; ар = Apple.RedDel; // Вывод значения enum. System.out.println("Значение ар: " + ар); System.out.println(); ар = Apple.GoldenDel; // Сравнение двух перечислимых значений. if(ар == Apple.GoldenDel) System.out.println("ар содержит GoldenDel."); // Применение enum для управления оператором switch. switch(ар) { case Jonathan: System.out.println("Jonathan красный."); break; case GoldenDel: System.out.println("Golden Delicious желтый."); break; case RedDel: System.out.println("Red Delicious красный."); break; case Winesap: System.out.println("Winesap красный."); break; case Cortland: System.out.println("Cortland красный."); break; } } }
Эта программа создает следующий вывод:
Значение ар: RedDel
ар содержит GoldenDel.
Golden Delicious желтый.