Треки
/
Java
Java
/
Вправи
/
Логи, логи, логи!
Логи, логи, логи!

Логи, логи, логи!

Навчальна вправа

Вступ

Переліки

Перелічуваний тип - це спеціальний тип даних, який дає змінній змогу набувати однієї з наперед визначених констант. Змінна має дорівнювати одному зі значень, наперед визначених для цього типу. Поширені приклади: сторони світу (значення 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)

На нас чекають три завдання.

1. Розбір рівня журналу

Визначте перелік LogLevel із шістьма елементами, що відповідають наведеним вище рівням журналу.

  • TRACE
  • DEBUG
  • INFO
  • WARNING
  • ERROR
  • FATAL

Далі реалізуйте метод LogLine.getLogLevel(), який повертає розібраний рівень переданого рядка журналу:

var logLine = new LogLine("[INF]: File deleted");
logLine.getLogLevel();
// => LogLevel.INFO

2. Підтримка невідомого рівня журналу

На жаль, подекуди рядки журналу мають невідомий рівень. Щоб коректно обробляти такі рядки журналу, додайте елемент UNKNOWN до переліку LogLevel; його слід повертати під час розбору невідомого рівня журналу:

var logLine = new LogLine("[XYZ]: Overly specific, out of context message");
logLine.getLogLevel();
// => LogLevel.UNKNOWN

3. Перетворення рядка журналу на короткий формат

Рівень журналу в рядку записано досить громіздко. Щоб зменшити місце на диску, потрібне для зберігання рядків журналу, було розроблено короткий формат: "[<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"
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Java Exercism

Час розпочати Логи, логи, логи!?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Java, а також 26 концепцій158 вправ та справжнє наставництво від людей, і все це безкоштовно.