Перелічуваний тип - це спеціальний тип даних, який дає змінній змогу набувати однієї з наперед визначених констант.
Змінна має дорівнювати одному зі значень, наперед визначених для цього типу.
Поширені приклади: сторони світу (значення 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
У цій вправі ми будемо обробляти рядки журналу.
Кожен рядок журналу записано як рядок тексту (англ. string) такого формату: "[<LVL>]: <MESSAGE>".
Ось які бувають рівні журналу:
TRC (trace)DBG (debug)INF (info)WRN (warning)ERR (error)FTL (fatal)На нас чекають три завдання.
Визначте перелік LogLevel із шістьма елементами, що відповідають наведеним вище рівням журналу.
TRACEDEBUGINFOWARNINGERRORFATALДалі реалізуйте метод LogLine.getLogLevel(), який повертає розібраний рівень переданого рядка журналу:
var logLine = new LogLine("[INF]: File deleted");
logLine.getLogLevel();
// => LogLevel.INFO
На жаль, подекуди рядки журналу мають невідомий рівень.
Щоб коректно обробляти такі рядки журналу, додайте елемент UNKNOWN до переліку LogLevel; його слід повертати під час розбору невідомого рівня журналу:
var logLine = new LogLine("[XYZ]: Overly specific, out of context message");
logLine.getLogLevel();
// => LogLevel.UNKNOWN
Рівень журналу в рядку записано досить громіздко.
Щоб зменшити місце на диску, потрібне для зберігання рядків журналу, було розроблено короткий формат: "[<ENCODED_LEVEL>]:<MESSAGE>".
Закодований рівень журналу отримуємо простим зіставленням рівня журналу з числом:
UNKNOWN - 0
TRACE - 1
DEBUG - 2
INFO - 4
WARNING - 5
ERROR - 6
FATAL - 42
Реалізуйте метод LogLine.getOutputForShortLog(), який виводить рядок журналу в скороченому форматі:
var logLine = new LogLine("[ERR]: Stack Overflow");
logLine.getOutputForShortLog();
// => "6:Stack Overflow"
Зареєструйтеся на Exercism, щоб вивчати й опановувати Java, а також 26 концепцій158 вправ та справжнє наставництво від людей, і все це безкоштовно.