Перелічуваний тип - це особливий тип даних, який дає змінній змогу набувати одну з наперед визначених констант.
Змінна повинна дорівнювати одному з визначених для неї значень.
Поширені приклади: сторони світу за компасом (значення NORTH, SOUTH, EAST і WEST) та дні тижня.
Оскільки це константи, назви полів перелічуваного типу записують великими літерами.
У мові програмування Java перелічуваний тип визначають за допомогою ключового слова enum.
Наприклад, перелічуваний тип для днів тижня визначають так:
public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
Перелічувані типи варто використовувати щоразу, коли потрібно представити фіксований набір констант. Це стосується як природних перелічуваних типів, наприклад планет Сонячної системи, так і наборів даних, усі можливі значення яких відомі під час компіляції, наприклад пунктів меню, прапорців командного рядка тощо.
Ось код, який показує, як використати перелік DayOfWeek, визначений вище:
public class Shop {
public String getOpeningHours(DayOfWeek dayOfWeek) {
switch (dayOfWeek) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
return "9am - 5pm";
case SATURDAY:
return "10am - 4pm"
case SUNDAY:
return "Closed.";
}
}
}
var shop = new Shop();
shop.getOpeningHours(DayOfWeek.WEDNESDAY);
// => "9am - 5pm"
Перелічувані типи в мові програмування Java значно потужніші за свої аналоги в інших мовах.
Оголошення enum визначає клас (який називають перелічуваним типом).
Тіло класу-переліку може містити методи та інші поля:
public enum Rating {
GREAT(5),
GOOD(4),
OK(3),
BAD(2),
TERRIBLE(1);
private final int numberOfStars;
Rating(int numberOfStars) {
this.numberOfStars = numberOfStars;
}
public int getNumberOfStars() {
return this.numberOfStars;
}
}
Виклик методу getNumberOfStars на члені перелічуваного типу Rating:
Rating.GOOD.getNumberOfStars();
// => 4
Компілятор автоматично додає деякі спеціальні методи, коли створює перелік.
Наприклад, вони мають статичний метод values, який повертає масив з усіма значеннями переліку в порядку їх оголошення:
for (DayOfWeek dayOfWeek : DayOfWeek.values()) {
System.out.println(dayOfWeek.toString());
}
Наведений вище фрагмент надрукує таке:
SUNDAY
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
Компілятор також додає статичний метод valueOf, який повертає члена переліку за його назвою:
DayOfWeek.valueOf("SUNDAY");
// => DayOfWeek.SUNDAY