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
staticblocks
- Todos os
enumherdam implicitamente dejava.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ística | Pode? |
|---|---|
| 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) | ✅ |