Comparaison des enum en Java : == ou equals() ? Les subtilités qu'on ne vous dit pas

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : L'erreur que vous commettez peut-être en ce moment

\n\n

Imaginez la situation : vous codez en Java, vous utilisez des énumérations (enum) et vous devez comparer deux valeurs. Vous écrivez automatiquement if (day == Day.MONDAY). Ou peut-être if (day.equals(Day.MONDAY)). Quelle est la bonne option ? Et y a-t-il une différence ?

\n\n

Cette question est l'une des plus populaires sur Stack Overflow. Des milliers de développeurs (des débutants aux seniors) se la sont posée. Cela semble un détail. Mais derrière ce « détail » se cache une compréhension profonde du fonctionnement de la JVM, de la structure des enum et des raisons pour lesquelles tout n'est pas si simple en Java.

\n\n

Dans cet article, nous allons une fois pour toutes clarifier : comment comparer correctement les enum en Java, quand utiliser == et quand utiliser equals(), et pourquoi l'une de ces options est presque toujours le meilleur choix.

\n\n

Réponse courte pour les impatients

\n\n

Si vous avez besoin d'une réponse immédiate — utilisez ==.

\n\n

Mais ! Avant de fermer l'article, comprenons pourquoi il en est ainsi et quels pièges peuvent vous attendre. Parce que le diable, comme toujours, se cache dans les détails.

\n\n

Pourquoi un enum n'est-il pas simplement un ensemble de constantes ?

\n\n

Pour comprendre la différence entre == et equals(), il faut se rappeler ce qu'est réellement un enum en Java.

\n\n

Chaque enum est une classe à part entière qui hérite implicitement de java.lang.Enum. Chaque constante d'enum est une instance statique finale de cette classe. La JVM garantit qu'il existe exactement un objet en mémoire pour chaque valeur d'enum.

\n\n

Regardez ce code :

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

Lorsque la JVM charge cet enum, elle crée exactement 7 objets. Day.MONDAY est toujours le même objet. Toujours. Et c'est le point clé.

\n\n

Comparaison avec == : Pourquoi cela fonctionne-t-il ?

\n\n

L'opérateur == en Java compare les références des objets. Il ne regarde pas le contenu — il vérifie si deux variables pointent vers le même objet en mémoire.

\n\n

Puisque la JVM garantit l'unicité de chaque instance d'enum, la comparaison avec == pour les enum fonctionne parfaitement :

\n\n
public class EnumComparison {\n    public static void main(String[] args) {\n        Day today = Day.WEDNESDAY;\n        Day anotherDay = Day.WEDNESDAY;\n        \n        // Les deux variables référencent le même objet en mémoire\n        System.out.println(today == anotherDay); // true\n        \n        // Comparaison avec une autre constante\n        System.out.println(today == Day.MONDAY); // false\n    }\n}
\n\n

Résultat :

\n
true\nfalse
\n\n

Tout est simple et élégant. Mais regardons ce qui se passe sous le capot.

\n\n

Pourquoi est-ce sûr ? Les garanties de la JVM

\n\n

La spécification du langage Java (JLS 8.9) garantit que chaque valeur d'enum est initialisée exactement une fois lors du chargement de la classe. Aucune réflexion, sérialisation ou clonage ne peut créer un doublon. Même si vous essayez d'utiliser new — le compilateur générera une erreur.

\n\n

Par conséquent, == pour les enum n'est pas seulement « ça marche », c'est la méthode de comparaison la plus rapide et la plus fiable.

\n\n

Comparaison avec equals() : Ça marche, mais avec des nuances

\n\n

La méthode equals() fonctionne aussi. La classe Enum redéfinit equals(), et en interne elle utilise == :

\n\n
// Code réel de java.lang.Enum\npublic final boolean equals(Object other) {\n    return this == other;\n}
\n\n

Autrement dit, l'appel day.equals(Day.MONDAY) fait finalement la même chose que day == Day.MONDAY. Mais il y a une différence importante :

\n\n

Le problème avec null

\n\n

Si votre variable peut êtr

Blogs

Book Recommendations