Sí, es como si hubiera creado instancias singleton para cada valor en la enumeración:
RoundingMode de clase abstracta pública {
RoundingMode final estático público HALF_UP = new RoundingMode ();
RoundingMode final estático público HALF_EVEN = new RoundingMode ();
Private RoundingMode () {
// el ámbito privado evita cualquier subtipo fuera de esta clase
}
}
Sin embargo , la enum
construcción le brinda varios beneficios:
- El toString () de cada instancia imprime el nombre dado en el código.
- (Como se mencionó en otra publicación,) una variable del tipo enum se puede comparar con constantes usando la
switch-case
estructura de control.
- Todos los valores de la enumeración se pueden consultar utilizando el
values
campo que se 'genera' para cada tipo de enumeración
- Aquí está la más importante de las comparaciones de identidad: los valores de enumeración sobreviven a la serialización sin clonación.
La serialización es una gran gotchya. Si tuviera que usar el código anterior en lugar de una enumeración, así es como se comportaría la igualdad de identidad:
RoundingMode original = RoundingMode.HALF_UP;
afirmar (RoundingMode.HALF_UP == original); // pasa
ByteArrayOutputStream baos = nuevo ByteArrayOutputStream ();
ObjectOutputStream oos = nuevo ObjectOutputStream (baos);
oos.writeObject (original);
oos.flush ();
ByteArrayInputStream bais = new ByteArrayInputStream (baos.toByteArray ());
ObjectInputStream ois = nuevo ObjectInputStream (bais);
RoundingMode deserializado = (RoundingMode) ois.readObject ();
afirmar (RoundingMode.HALF_UP == deserializado); // falla
afirmar (RoundingMode.HALF_EVEN == deserializado); // falla
Usted puede abordar esta cuestión sin enumeración, utilizando una técnica que implica writeReplace
y readResolve
, (ver http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html ) ...
Supongo que el punto es que Java hace todo lo posible para permitirle usar las identidades de los valores de enumeración para probar la igualdad; es una práctica recomendada.