Peut - ==
être utilisé sur enum
?
Oui: les énumérations ont serré instance de contrôle qui vous permet d'utiliser ==
à comparer les instances. Voici la garantie fournie par la spécification du langage:
Un type enum n'a pas d'instances autres que celles définies par son enum constantes.
C'est une erreur de compilation pour tenter d'instancier explicitement un type enum. L' final clone
méthode de Enum
assure enum
des constantes ne peut jamais être cloné, et le traitement spécial par le mécanisme de sérialisation s'assure que les instances dupliquées ne sont jamais créées à la suite de la désérialisation. Réfléchissant à l'instanciation des types enum est interdite. Ensemble, ces quatre choses s'assurer qu'aucune des instances d' enum
type existent au-delà de celles définies par l' enum
des constantes.
Car il n'existe qu'une seule instance de chaque enum
constante, il est permis d'utiliser l' ==
de l'opérateur en place de l' equals
méthode lorsque l'on compare les deux références de l'objet si il est connu qu'au moins l'un d'eux se réfère à un enum
constante. ( equals
Méthode de Enum
est final
méthode qui se borne à invoquer super.equals
sur son argument et renvoie le résultat, réalisant ainsi une identité comparaison).
Cette garantie est suffisamment forte pour que Josh Bloch recommande, si vous insistez sur l'utilisation d'un singleton, la meilleure façon de la mettre en œuvre est l'utilisation d'un seul élément enum
(voir: Efficace Java 2nd Edition, Point 3: Appliquer le singleton de la propriété avec un constructeur privé ou d'un type d'énumération; aussi la sécurité des Threads en Singleton)
Quelles sont les différences entre ==
et equals
?
Pour rappel, il doit être dit qu'en général, ==
n'est PAS une alternative viable à l' equals
. Quand il est, cependant (comme avec enum
), il y a deux différences importantes à prendre en compte:
==
jamais jette NullPointerException
enum Color { BLACK, WHITE };
Color nothing = null;
if (nothing == Color.BLACK); // runs fine
if (nothing.equals(Color.BLACK)); // throws NullPointerException
==
est sous réserve de la compatibilité du type de vérifier au moment de la compilation
enum Color { BLACK, WHITE };
enum Chiral { LEFT, RIGHT };
if (Color.BLACK.equals(Chiral.LEFT)); // compiles fine
if (Color.BLACK == Chiral.LEFT); // DOESN'T COMPILE!!! Incompatible types!
Devrait - ==
être utilisés le cas échéant?
Bloch mentionne spécifiquement que immuables classes qui ont le contrôle de leurs instances peuvent garantir à leurs clients que ==
est utilisable. enum
est spécifiquement mentionné pour illustrer.
Article 1: Envisager statique usine méthodes à la place des constructeurs
[...] il permet immuable classe pour vous la garantie de l'absence de deux cas existent: a.equals(b)
si et seulement si a==b
. Si une classe rend cette garantie, puis à ses clients d'utiliser l' ==
opérateur au lieu de l' equals(Object)
méthode, ce qui peut entraîner une amélioration des performances. Les types Enum fournir cette garantie.
Pour résumer, les arguments pour l'utilisation de ==
sur enum
sont:
- Elle fonctionne.
- C'est plus rapide.
- Il est plus sûr au moment de l'exécution.
- Il est plus sûr au moment de la compilation.