Parfois, vous ne savez peut-être pas que l'environnement que vous vous branchez, le code a plus d'un chargeur de classe. Puis-je vous attendre toujours à cette opération "==" fonctionnera sur des valeurs ENUM dans ce cas? P>
3 Réponses :
Vous serez peut-être intéressé par la classe Apache Commons Lang: texte de liaison p> "==" code> ne fonctionnera pas, mais que vous souhaitez utiliser
.equals () code> de toute façon. p>
BTW, implémentation de Enum Equals () code> Appels simples
Ceci == Autre code> (Sun / Oracle JDK 6).
yup, comme je viens d'écrire dans ma propre réponse
Cela pourrait être vrai pour cette version. Cependant, après la sémantique linguistique, == code> ne sera jamais valide alors que
.equals () code> pourrait (!) Travail. Voir aussi la implémentation d'Apache-Commons Enum.
Je connais la distinction importante entre == et égale (). Mais Enum enfreint intentionnellement cette distinction et ce n'est pas susceptible de changer. Bien que je conviens que des égaux est un meilleur choix sémantiquement
Plusieurs chargeurs de classes peuvent ne pas être le problème, tant que l'ENUM n'est disponible que par l'un d'entre eux. Si ce n'est pas le cas, vous perdez tous les avantages d'une énorme.
et d'ailleurs, en utilisant égaux () code> ne vous aide pas non plus. Voici la mise en œuvre de
Enum.equals (objet) code> dans java 1.6: p>
Même chose ici que sur le poteau de Josefx; Il peut toujours fonctionner lorsqu'un énorme est chargé par plusieurs chargeurs de classe, il suffit de faire attention à ce qu'ils soient isolés les uns des autres.
Bien sûr, mais c'est une douleur. Il brise toute hypothèse que l'on a tendance à faire des énumérums. Et il brise le motif de l'énum singleton.
Les chargeurs de classes brisent tous les modèles singleton.
Si votre classe Enum n'est que chargée une fois qu'elle fonctionnera toujours. strong> p>
Java utilise des instances d'objet pour représenter les différentes valeurs ENUM, chacune de ces instances est stockée en tant que champ statique dans la classe Enum. Si l'énuméro est chargée deux fois, chaque valeur Enum est représentée par deux instances d'objet différentes. L'opérateur
== compare uniquement les références et n'est pas conscient des multiples instances représentant une valeur ENUM, de sorte qu'elles ne correspondent pas à des valeurs chargées par différents chargeurs de classe. p>
"L'opérateur == ne compare que les références" sonne un peu comme un dogme. Enum est déjà une chose assez spéciale. Une spécialité de plus pourrait être défini sur "==" comme "this.ordinal () == ce.ordinal ()". Cela pourrait-il résoudre le problème?
@Dima tant que les deux définitions chargées de l'énum sont identiques, cela fonctionnera. La valeur ordinale ne contient que l'index (position) de la constante Enum dans le code source, si le code change (de nouvelles valeurs, une commande différente), il serait toujours rompu. Si la vitesse n'est pas un problème, vous pouvez comparer leurs noms.