Tracks
/
Java
Java
/
Übungen
/
Logs, Logs, Logs!
Logs, Logs, Logs!

Logs, Logs, Logs!

Lernübung

Einführung

Enums

Ein Enum-Typ ist ein spezieller Datentyp, mit dem eine Variable einen Wert aus einer Menge vordefinierter Konstanten annehmen kann. Der Wert der Variablen muss einem der Werte entsprechen, die für sie vordefiniert wurden. Häufige Beispiele sind Himmelsrichtungen (Werte wie NORTH, SOUTH, EAST und WEST) und die Wochentage.

Da es sich um Konstanten handelt, werden die Namen der Felder eines Enum-Typs in Großbuchstaben geschrieben.

Einen Enum-Typ definieren

In der Programmiersprache Java definierst du einen Enum-Typ mit dem Schlüsselwort enum. Ein Enum-Typ für die Wochentage sieht zum Beispiel so aus:

public enum DayOfWeek {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY
}

Du solltest Enum-Typen immer dann verwenden, wenn du eine feste Menge von Konstanten darstellen musst. Das umfasst natürliche Enum-Typen wie die Planeten unseres Sonnensystems und Datensätze, bei denen du zur Kompilierzeit alle möglichen Werte kennst, zum Beispiel Menüoptionen, Kommandozeilen-Flags und so weiter.

Einen Enum-Typ verwenden

Hier ist etwas Code, der dir zeigt, wie du den oben definierten Enum-Typ DayOfWeek verwendest:

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"

Methoden und Felder hinzufügen

Enum-Typen in Java sind viel mächtiger als ihre Gegenstücke in anderen Sprachen. Die enum-Deklaration definiert eine Klasse (auch Enum-Typ genannt). Der Körper der Enum-Klasse kann Methoden und andere Felder enthalten:

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;
    }
}

So rufst du die Methode getNumberOfStars für ein Mitglied des Enum-Typs Rating auf:

Rating.GOOD.getNumberOfStars();
// => 4

Anleitung

In dieser Übung verarbeitest du Log-Zeilen.

Jede Log-Zeile ist ein String mit folgendem Format: "[<LVL>]: <MESSAGE>".

Das sind die verschiedenen Log-Level:

  • TRC (trace)
  • DBG (debug)
  • INF (info)
  • WRN (warning)
  • ERR (error)
  • FTL (fatal)

Du hast drei Aufgaben.

1. Log-Level parsen

Definiere ein LogLevel-Enum mit sechs Elementen, die den oben genannten Log-Leveln entsprechen.

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

Implementiere als Nächstes die Methode LogLine.getLogLevel(), die den geparsten Log-Level einer Log-Zeile zurückgibt:

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

2. Unbekannte Log-Level unterstützen

Leider haben gelegentlich einige Log-Zeilen einen unbekannten Log-Level. Um diese Log-Zeilen sauber zu behandeln, füge dem LogLevel-Enum ein Element UNKNOWN hinzu, das beim Parsen eines unbekannten Log-Levels zurückgegeben werden soll:

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

3. Log-Zeile in ein Kurzformat umwandeln

Der Log-Level einer Log-Zeile ist recht ausführlich. Um den Speicherplatz zu reduzieren, der zum Speichern der Log-Zeilen nötig ist, wurde ein Kurzformat entwickelt: "[<ENCODED_LEVEL>]:<MESSAGE>".

Der kodierte Log-Level ist eine einfache Zuordnung eines Log-Levels zu einer Zahl:

  • UNKNOWN - 0
  • TRACE - 1
  • DEBUG - 2
  • INFO - 4
  • WARNING - 5
  • ERROR - 6
  • FATAL - 42

Implementiere die Methode LogLine.getOutputForShortLog(), die das verkürzte Log-Zeilen-Format ausgeben kann:

var logLine = new LogLine("[ERR]: Stack Overflow");
logLine.getOutputForShortLog();
// => "6:Stack Overflow"
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Java Exercism

Bereit, mit Logs, Logs, Logs! zu starten?

Melde dich bei Exercism an, um Java mit 26 Konzepte158 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.