Sim, é como se você tivesse criado instâncias singleton para cada valor no enum:
public abstract class RoundingMode {
público estático final RoundingMode HALF_UP = new RoundingMode ();
público estático final RoundingMode HALF_EVEN = new RoundingMode ();
private RoundingMode () {
// escopo privado impede qualquer subtipo fora desta classe
}
}
No entanto , a enum
construção oferece vários benefícios:
- O toString () de cada instância imprime o nome fornecido no código.
- (Como mencionado em outra postagem), uma variável do tipo enum pode ser comparada com constantes usando a
switch-case
estrutura de controle.
- Todos os valores na enumeração podem ser consultados usando o
values
campo que é 'gerado' para cada tipo de enum
- Aqui está a grande comparação de identidade: valores enum sobrevivem à serialização sem clonagem.
A serialização é uma grande pegadinha. Se eu fosse usar o código acima em vez de um enum, eis como a igualdade de identidade se comportaria:
RoundingMode original = RoundingMode.HALF_UP;
assert (RoundingMode.HALF_UP == original); // passa
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 desserialized = (RoundingMode) ois.readObject ();
assert (RoundingMode.HALF_UP == desserializado); // falha
assert (RoundingMode.HALF_EVEN == desserializado); // falha
Você pode resolver esse problema sem enum, usando uma técnica que envolve writeReplace
e readResolve
, (consulte http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html ) ...
Eu acho que o ponto é - Java sai de seu caminho para permitir que você use identidades de valores enum para testar a igualdade; é uma prática incentivada.