Percursos
/
Java
Java
/
Exercícios
/
Registos, registos, registos!
Registos, registos, registos!

Registos, registos, registos!

Exercício de aprendizagem

Introdução

Enums

Um tipo enum é um tipo de dados especial que permite que uma variável seja um conjunto de constantes predefinidas. A variável tem de ser igual a um dos valores predefinidos para ela. Exemplos comuns incluem os pontos cardeais (valores NORTH, SOUTH, EAST e WEST) e os dias da semana.

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

Definir um tipo enum

Na linguagem de programação Java, defines um tipo enum com a palavra-chave enum. Por exemplo, um tipo enum para os dias da semana especifica-se assim:

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

Deves usar tipos enum sempre que precisares de representar um conjunto fixo de constantes. Isso inclui tipos enum naturais, como os planetas do nosso sistema solar, e conjuntos de dados cujos valores possíveis conheces todos em tempo de compilação: por exemplo, as opções de um menu, as opções de linha de comandos, e assim por diante.

Usar um tipo enum

Aqui está algum código que te 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"

Adicionar métodos e campos

Os tipos enum da linguagem de programação Java são muito mais poderosos do que os seus equivalentes noutras linguagens. A declaração enum define uma classe (chamada 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;
    }
}

Chamar o método getNumberOfStars num membro do tipo enum Rating:

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

Instruções

Neste exercício vais processar linhas de log.

Cada linha de log é uma string com o seguinte formato: "[<LVL>]: <MESSAGE>".

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

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

Tens três tarefas.

1. Analisar o nível de log

Define uma enumeração LogLevel com seis elementos correspondentes aos níveis de log acima.

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

De seguida, implementa o método LogLine.getLogLevel(), que devolve o nível de log analisado de uma linha de log:

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

2. Suportar níveis de log desconhecidos

Infelizmente, por vezes algumas linhas de log têm um nível de log desconhecido. Para tratar estas linhas de log de forma elegante, adiciona um elemento UNKNOWN à enumeração LogLevel, que deve ser devolvido 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 a linha de log no formato curto

O nível de log de uma linha de log é bastante extenso. Para reduzir o espaço em disco necessário para armazenar as linhas de log, foi criado 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

Implementa o método LogLine.getOutputForShortLog(), que consegue produzir o formato curto da linha de log:

var logLine = new LogLine("[ERR]: Stack Overflow");
logLine.getOutputForShortLog();
// => "6:Stack Overflow"
Editar via GitHub A ligação abre numa nova janela ou separador
Java Exercism

Estás pronto para começar Registos, registos, registos!?

Inscreve-te no Exercism para aprenderes e dominares Java com 26 conceitos158 exercícios, e mentoria humana real, tudo grátis.