Основные понятия о перечислениях

Перечисления создаются использованием ключевого слова 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 уже неявно задает тип enum для операторов case. Нет необходимости квалифицировать константы в операторах case именем их типа enum. Фактически попытка сделать это приведет к ошибке компиляции.

Когда константа перечисления отображается, скажем, методом println (), выводится ее имя. Например, следующая строка кода:

System.out.println(Apple.Winesapp) отобразит имя Winesapp.

Приведенная ниже программа собирает все вместе и демонстрирует применение перечисления Apple:

// Перечисление сортов яблок.
enum Apple {
Jonathan, GoldenDel, RedDel, Winesap, Cortland
class EnumDemo {
public static void main(String args[]) {
Apple ap;
ap = Apple.RedDel;
// Вывод значения enum.
System.out.println("Значение ap: " + ap) ;
System.out.println();
ap = Apple.GoIdenDel;
// Сравнение двух перечислимых значений.
if (ар == Apple.GoldenDel)
System.out.println("ар содержит GoldenDel.\n");
// Применение 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 желтый.