Posso usar ==
enums em Java ou preciso usar .equals()
? Nos meus testes, ==
sempre funciona, mas não tenho certeza se tenho certeza disso. Em particular, não existe nenhum .clone()
método em um enum, então não sei se é possível obter um enum para o qual .equals()
retornaria um valor diferente de ==
.
Por exemplo, isso está OK:
public int round(RoundingMode roundingMode) {
if(roundingMode == RoundingMode.HALF_UP) {
//do something
} else if (roundingMode == RoundingMode.HALF_EVEN) {
//do something
}
//etc
}
Ou preciso escrever desta forma:
public int round(RoundingMode roundingMode) {
if(roundingMode.equals(RoundingMode.HALF_UP)) {
//do something
} else if (roundingMode.equals(RoundingMode.HALF_EVEN)) {
//do something
}
//etc
}
Respostas:
Apenas meus 2 centavos: Aqui está o código para Enum.java, conforme publicado pela Sun, e parte do JDK:
fonte
Sim, == está bem - é garantido que haja apenas uma única referência para cada valor.
No entanto, há uma maneira melhor de escrever seu método redondo:
Uma maneira ainda melhor de fazer isso é colocar a funcionalidade dentro do próprio enum, para que você possa apenas chamar
roundingMode.round(someValue)
. Isso vai ao cerne dos enums Java - eles são enums orientados a objetos , ao contrário dos "valores nomeados" encontrados em outros lugares.EDIT: A especificação não é muito clara, mas a seção 8.9 afirma:
fonte
Sim, é como se você tivesse criado instâncias singleton para cada valor no enum:
No entanto , a
enum
construção oferece vários benefícios:switch-case
estrutura de controle.values
campo que é 'gerado' para cada tipo de enumA 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:
Você pode resolver esse problema sem enum, usando uma técnica que envolve
writeReplace
ereadResolve
, (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.
fonte
== compara as referências de dois objetos. Para enums, é garantido que haverá apenas uma instância e, portanto, para quaisquer dois enums iguais, == será verdadeiro.
Referência:
http://www.ajaxonomy.com/2007/java/making-the-most-of-java-50-enum-tricks
(não foi possível encontrar nada nos documentos do Sun)
fonte
Aqui está um código maligno que você pode achar interessante. : D
fonte
Unsafe.class
.Enums são um ótimo lugar para bloquear código polimórfico.
fonte
Observe que há um problema ao transferir enum via RMI / IIOP. Veja este tópico:
http://www.velocityreviews.com/forums/t390342-enum-equality.html
fonte
== está geralmente bem, e há vantagens para == e
.equals()
. Eu pessoalmente prefiro sempre usar.equals()
ao comparar objetos, incluindoenum
s. Veja também esta discussão:Comparando membros enum Java: == ou equals ()?
fonte