Puis-je utiliser des ==
énumérations en Java ou dois-je utiliser .equals()
? Dans mes tests, cela ==
fonctionne toujours, mais je ne suis pas sûr que j'en soit garanti. En particulier, il n'y a pas de .clone()
méthode sur une enum, donc je ne sais pas s'il est possible d'obtenir une enum pour laquelle .equals()
retournerait une valeur différente de ==
.
Par exemple, est-ce OK:
public int round(RoundingMode roundingMode) {
if(roundingMode == RoundingMode.HALF_UP) {
//do something
} else if (roundingMode == RoundingMode.HALF_EVEN) {
//do something
}
//etc
}
Ou dois-je l'écrire de cette façon:
public int round(RoundingMode roundingMode) {
if(roundingMode.equals(RoundingMode.HALF_UP)) {
//do something
} else if (roundingMode.equals(RoundingMode.HALF_EVEN)) {
//do something
}
//etc
}
Réponses:
Juste mes 2 cents: Voici le code pour Enum.java, tel que publié par Sun, et faisant partie du JDK:
la source
Oui, == est très bien - il n'y a qu'une seule référence pour chaque valeur.
Cependant, il existe une meilleure façon d'écrire votre méthode ronde:
Une façon encore meilleure de le faire est de mettre la fonctionnalité dans l'énumération elle-même, afin que vous puissiez simplement appeler
roundingMode.round(someValue)
. Cela touche le cœur des énumérations Java - ce sont des énumérations orientées objet , contrairement aux «valeurs nommées» trouvées ailleurs.EDIT: La spécification n'est pas très claire, mais la section 8.9 stipule:
la source
Oui, c'est comme si vous aviez créé des instances singleton pour chaque valeur de l'énumération:
Cependant , la
enum
conception vous offre divers avantages:switch-case
structure de contrôle.values
champ «généré» pour chaque type d'énumérationLa sérialisation est un gros gotchya. Si je devais utiliser le code ci-dessus au lieu d'une énumération, voici comment l'égalité d'identité se comporterait:
Vous pouvez résoudre ce problème sans énumération, en utilisant une technique qui implique
writeReplace
etreadResolve
, (voir http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html ) ...Je suppose que le point est - Java fait tout son possible pour vous permettre d'utiliser les identités des valeurs enum pour tester l'égalité; c'est une pratique encouragée.
la source
== compare les références de deux objets. Pour les énumérations, il est garanti qu'il n'y aura qu'une seule instance, et par conséquent, pour deux énumérations identiques, == sera vrai.
Référence:
http://www.ajaxonomy.com/2007/java/making-the-most-of-java-50-enum-tricks
(je n'ai rien trouvé dans la documentation Sun)
la source
Voici un code maléfique que vous pourriez trouver intéressant. :RÉ
la source
Unsafe.class
.Les énumérations sont un excellent endroit pour brouiller le code polymorphe.
la source
Notez qu'il y a un problème lors du transfert d'énumération via RMI / IIOP. Voir ce fil:
http://www.velocityreviews.com/forums/t390342-enum-equality.html
la source
== est généralement correct, et il y a des avantages à la fois à == et
.equals()
. Personnellement, je préfère toujours utiliser.equals()
lors de la comparaison d'objets, y comprisenum
s. Voir aussi cette discussion:Comparaison des membres de l'énumération Java: == ou equals ()?
la source