Oui, c'est comme si vous aviez créé singleton instances pour chaque valeur de l'enum:
public abstract class RoundingMode {
public static final RoundingMode HALF_UP = new RoundingMode();
public static final RoundingMode HALF_EVEN = new RoundingMode();
privé RoundingMode() {
// portée privée empêche tout sous-dehors de cette classe
}
}
Cependant, l' enum
construction vous offre divers avantages:
- Chaque instance de toString() affiche le nom donné dans le code.
- (Comme mentionné dans un autre post, une variable de type enum peut être comparé à des constantes à l'aide de l'
switch-case
de la structure de contrôle.
- Toutes les valeurs dans l'énumération peut être interrogé à l'aide de l'
values
champ qui est "générée" pour chaque type enum
-
Voici le grand w.r.t de l'identité des comparaisons: les valeurs de l'enum survivre à la sérialisation sans clonage.
La sérialisation est un grand gotchya. Si je devais utiliser le code ci-dessus à la place d'un enum, voici comment l'identité des sexes se comporter:
RoundingMode original = RoundingMode.HALF_UP;
assert (RoundingMode.HALF_UP == original); // passe
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(original);
oos.flush();
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
RoundingMode désérialisé = (RoundingMode) ois.readObject();
assert (RoundingMode.HALF_UP == désérialisé); // échoue
assert (RoundingMode.HALF_EVEN == désérialisé); // échoue
Vous pouvez résoudre ce problème sans enum, à l'aide d'une technique qui implique l' writeReplace
et readResolve
(voir http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html)...
Je suppose que le point est -- Java sort de sa façon de vous permettre d'utiliser les valeurs de l'enum' identités pour les tests d'égalité; c'est un encourage la pratique.