🧠 O que são enums em Java?

Enums são tipos especiais de classe que representam um conjunto fixo de constantes. São usados quando um valor pode ser um dentre um número limitado de opções.

Por exemplo: dias da semana, estados de um pedido, níveis de prioridade, etc.

public enum DiaDaSemana {
  SEGUNDA, TERCA, QUARTA, QUINTA, 
  SEXTA, SABADO, DOMINGO;
}

✅ Características importantes dos enum:

  • São classes, então podem ter:
    • Campos
    • Construtores
    • Métodos
    • static blocks
  • Todos os enum herdam implicitamente de java.lang.Enum (não podem estender outras classes).
  • Podem implementar interfaces, mas não podem estender outra classe.
  • Os valores de um enum são objetos constantes, imutáveis e singleton (só existe uma instância de cada).

✅ Exemplo com campos, construtor e métodos:

public enum Prioridade {
  BAIXA(1), MEDIA(2), ALTA(3);

  private int nivel;

  // Construtor do enum é SEMPRE privado
  Prioridade(int nivel) {
    this.nivel = nivel;
  }

  public int getNivel() {
    return nivel;
  }
}

Uso:

public class TesteEnum {
  public static void main(String[] args) {
    Prioridade p = Prioridade.ALTA;
    System.out.println(p); // ALTA
    System.out.println(p.getNivel()); // 3
  }
}

values() e valueOf()

for (Prioridade p : Prioridade.values()) {
  System.out.println(p + " - " + p.getNivel());
}
// retorna o enum BAIXA
Prioridade p = Prioridade.valueOf("BAIXA"); 

❌ Erros comuns e pegadinhas:

🔸 1. Construtores de enum são sempre privados (implícitos).

Não pode usar public ou protected.

enum Exemplo {
  X(1);
  private int v;

  // ✅ OK
  Exemplo(int v) {} 

  // ❌ ERRO
  public Exemplo(int v) {} 
}

🔸 2. enum não pode estender classes.

Mas pode implementar interfaces.

interface A {
  void fazer();
}

enum Tipo implements A {
  UM {
    public void fazer() {
      System.out.println("UM");
    }
  },
  DOIS {
    public void fazer() {
      System.out.println("DOIS");
    }
  };
}

🔸 3. É possível sobrescrever métodos por constante:

enum Tipo {
  UM {
    @Override
    public String toString() {
      return "Tipo UM";
    }
  },
  DOIS;
}

🔸 4. switch com enum

Prioridade p = Prioridade.ALTA;

switch(p) {
  case ALTA:
    System.out.println("more prior");
    break;
  case MEDIA:
  case BAIXA:
    System.out.println("less prior");
    break;
}

📝 Hora do Simulado

1) Dado o código:

Gabarito: ✅ C — Erro: construtores em enum devem ser private

public enum Status {
  ATIVO, INATIVO, PENDENTE;
 
  private int codigo;
 
  public Status(int c) {
    this.codigo = c;
  }
}

O que acontece?

A) Compila e executa normalmente
B) Compila, mas gera exceção
C) Erro: construtores em enum devem ser private
D) Erro: enum não pode ter construtor public

2) Qual a saída?

Gabarito: ✅ B — 2

📌 AZUL(2) chama o construtor, e o método getValor() retorna 2.

enum Cor {
  VERMELHO(1), AZUL(2), VERDE(3);
  
  private int valor;
  Cor(int valor) {
    this.valor = valor;
  }
  
  int getValor() { return valor; }
}
  
public class Teste {
  public static void main(String[] args) {
    System.out.println(Cor.AZUL.getValor());
  }
}

A) 1
B) 2
C) 3
D) null

3) Considere o enum:

Gabarito: ✅ B — Tipo.values()

📌 O método values() é gerado automaticamente pelo compilador e retorna um array com todas as constantes do enum.

enum Tipo {
  UM, DOIS, TRES;
}

Qual alternativa imprime corretamente todas as constantes?

A) Tipo.lista()
B) Tipo.values()
C) Tipo.getEnums()
D) new Tipo()

4) Qual das alternativas é verdadeira?

Gabarito: ✅ A — Enums podem ter métodos e construtores

📌 Embora enums sejam tipos especiais, eles podem conter campos, métodos e construtores — mas o construtor deve ser privado.

A) Enums podem ter métodos e construtores.
B) Enums podem estender uma classe abstrata.
C) Enums são final por padrão e podem ser instanciados com new.
D) Enum não pode implementar interfaces.

5) O que será impresso?

Gabarito: ✅ B — Nivel 3

📌 O toString() foi sobrescrito, então ao fazer System.out.println(Nivel.ALTO) vai imprimir "Nivel 3".

enum Nivel {
  BAIXO(1), MEDIO(2), ALTO(3);

  private int valor;
  Nivel(int valor) {
    this.valor = valor;
  }

  public String toString() {
    return "Nivel " + valor;
  }
}

public class Teste {
  public static void main(String[] args) {
    System.out.println(Nivel.ALTO);
  }
}

A) ALTO
B) Nivel 3
C) 3
D) null

🧠 RESUMO: enum em Java

CaracterísticaPode?
Ter métodos e campos
Ter construtor private
Ter construtor public
Implementar interfaces
Estender uma classe
Ter métodos sobrescritos por constante
Usar switch com enum
Instanciar com new
Usar values()
Usar valueOf(String)

Deixe um comentário