Trilhas
/
Java
Java
/
Exercícios
/
Logs, logs, logs!
Logs, logs, logs!

Logs, logs, logs!

Exercício de aprendizagem

Introdução

Enums

Um tipo enum é um tipo de dado especial que permite que uma variável seja um conjunto de constantes predefinidas. A variável precisa ser igual a um dos valores predefinidos para ela. Exemplos comuns incluem as direções da bússola (valores de NORTH, SOUTH, EAST e WEST) e os dias da semana.

Como são constantes, os nomes dos campos de um tipo enum ficam em letras maiúsculas.

Definindo um tipo enum

Na linguagem de programação Java, você define um tipo enum com a palavra-chave enum. Por exemplo, você definiria um tipo enum para os dias da semana assim:

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

Você deve usar tipos enum sempre que precisar representar um conjunto fixo de constantes. Isso inclui tipos enum naturais, como os planetas do nosso sistema solar, e conjuntos de dados em que você conhece todos os valores possíveis em tempo de compilação, por exemplo, as opções de um menu, as flags de linha de comando e por aí vai.

Usando um tipo enum

Veja um código que mostra como usar o enum DayOfWeek definido acima:

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"

Adicionando métodos e campos

Os tipos enum da linguagem Java são muito mais poderosos que os equivalentes em outras linguagens. A declaração enum define uma classe (chamada de tipo enum). O corpo da classe enum pode incluir métodos e outros campos:

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

Chamando o método getNumberOfStars em um membro do tipo enum Rating:

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

Instruções

Neste exercício, você vai processar linhas de log.

Cada linha de log é uma string formatada da seguinte forma: "[<LVL>]: <MESSAGE>".

Estes são os diferentes níveis de log:

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

Você tem três tarefas.

1. Analisar o nível de log

Defina um enum LogLevel que tem seis elementos correspondentes aos níveis de log acima.

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

Em seguida, implemente o método LogLine.getLogLevel() que retorna o nível de log analisado de uma linha de log:

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

2. Lidar com nível de log desconhecido

Infelizmente, de vez em quando algumas linhas de log têm um nível de log desconhecido. Para lidar com essas linhas de log de forma elegante, adicione um elemento UNKNOWN ao enum LogLevel, que deve ser retornado ao analisar um nível de log desconhecido:

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

3. Converter linha de log para formato curto

O nível de log de uma linha de log é bastante verboso. Para reduzir o espaço em disco necessário para armazenar as linhas de log, foi desenvolvido um formato curto: "[<ENCODED_LEVEL>]:<MESSAGE>".

O nível de log codificado é um mapeamento simples de um nível de log para um número:

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

Implemente o método LogLine.getOutputForShortLog() que consegue gerar o formato encurtado de linha de log:

var logLine = new LogLine("[ERR]: Stack Overflow");
logLine.getOutputForShortLog();
// => "6:Stack Overflow"
Editar via GitHub O link abre em uma nova janela ou aba
Java Exercism

Tudo pronto para começar Logs, logs, logs!?

Crie sua conta no Exercism para aprender e dominar Java com 26 conceitos158 exercícios e mentoria humana de verdade, tudo de graça.