Comparação de enum em Java: == ou equals()? Sutilizas que ninguém conta

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: O erro que você talvez esteja cometendo agora

\n\n

Imagine a situação: você está programando em Java, usando enumerações (enum) e precisa comparar dois valores. Automaticamente, você escreve if (day == Day.MONDAY). Ou, talvez, if (day.equals(Day.MONDAY)). E qual é a opção correta? E existe alguma diferença?

\n\n

Esta pergunta é uma das mais populares no Stack Overflow. Milhares de desenvolvedores (de iniciantes a seniores) já se perguntaram isso. Parece um detalhe. Mas por trás desse "detalhe" está uma compreensão profunda de como a JVM funciona, como os enum são estruturados e por que nem tudo em Java é tão simples.

\n\n

Neste artigo, vamos esclarecer de uma vez por todas: como comparar corretamente enum em Java, quando usar == e quando usar equals(), e por que uma dessas opções é quase sempre a melhor escolha.

\n\n

Resposta rápida para os impacientes

\n\n

Se você precisa da resposta agora — use ==.

\n\n

Mas! Antes de fechar o artigo, vamos entender por que isso é assim e quais armadilhas podem te esperar. Porque o diabo, como sempre, está nos detalhes.

\n\n

Por que enum não é apenas um conjunto de constantes?

\n\n

Para entender a diferença entre == e equals(), precisamos lembrar o que é um enum em Java na prática.

\n\n

Cada enum é uma classe completa, que herda implicitamente de java.lang.Enum. Cada constante enum é uma instância final estática dessa classe. A JVM garante que, para cada valor enum, existe exatamente um objeto na memória.

\n\n

Veja este código:

\n\n
public enum Day {\n    MONDAY,\n    TUESDAY,\n    WEDNESDAY,\n    THURSDAY,\n    FRIDAY,\n    SATURDAY,\n    SUNDAY\n}
\n\n

Quando a JVM carrega este enum, ela cria exatamente 7 objetos. Day.MONDAY é sempre o mesmo objeto. Sempre. E este é o ponto chave.

\n\n

Comparação com ==: Por que funciona?

\n\n

O operador == em Java compara referências de objetos. Ele não olha para o conteúdo — ele verifica se duas variáveis apontam para o mesmo objeto na memória.

\n\n

Como a JVM garante a unicidade de cada instância enum, a comparação com == para enum funciona perfeitamente:

\n\n
public class EnumComparison {\n    public static void main(String[] args) {\n        Day today = Day.WEDNESDAY;\n        Day anotherDay = Day.WEDNESDAY;\n        \n        // Ambas as variáveis referenciam o mesmo objeto na memória\n        System.out.println(today == anotherDay); // true\n        \n        // Comparação com outra constante\n        System.out.println(today == Day.MONDAY); // false\n    }\n}
\n\n

Saída:

\n
true\nfalse
\n\n

Tudo simples e elegante. Mas vamos ver o que acontece nos bastidores.

\n\n

Por que é seguro? Garantias da JVM

\n\n

A Especificação da Linguagem Java (JLS 8.9) garante que cada valor enum é inicializado exatamente uma vez durante o carregamento da classe. Nenhuma reflexão, serialização ou clonagem pode criar uma duplicata. Mesmo se você tentar usar new — o compilador emitirá um erro.

\n\n

Portanto, == para enum não é apenas "funciona", é a forma mais rápida e confiável de comparação.

\n\n

Comparação com equals(): Funciona, mas tem nuances

\n\n

O método equals() também funciona. A classe Enum sobrescreve equals() e, internamente, usa ==:

\n\n
// Código real de java.lang.Enum\npublic final boolean equals(Object other) {\n    return this == other;\n}
\n\n

Ou seja, chamar day.equals(Day.MONDAY) acaba fazendo a mesma coisa que day == Day.MONDAY. Mas há uma diferença importante:

\n\n

Problema com null

\n\n

Se sua variável pode ser

Blogs

Book Recommendations