¿Está bien usar ==
en enumeraciones en Java, o necesito usarlo .equals()
? En mis pruebas, ==
siempre funciona, pero no estoy seguro si tengo la garantía de eso. En particular, no hay un .clone()
método en una enumeración, por lo que no sé si es posible obtener una enumeración para la que .equals()
devolvería un valor diferente a ==
.
Por ejemplo, esto está bien:
public int round(RoundingMode roundingMode) {
if(roundingMode == RoundingMode.HALF_UP) {
//do something
} else if (roundingMode == RoundingMode.HALF_EVEN) {
//do something
}
//etc
}
O necesito escribirlo de esta manera:
public int round(RoundingMode roundingMode) {
if(roundingMode.equals(RoundingMode.HALF_UP)) {
//do something
} else if (roundingMode.equals(RoundingMode.HALF_EVEN)) {
//do something
}
//etc
}
Respuestas:
Solo mis 2 centavos: aquí está el código de Enum.java, publicado por Sun, y parte del JDK:
fuente
Sí, == está bien, se garantiza que habrá una única referencia para cada valor.
Sin embargo, hay una mejor manera de escribir su método de ronda:
Una forma aún mejor de hacerlo es poner la funcionalidad dentro de la enumeración, por lo que podría simplemente llamar
roundingMode.round(someValue)
. Esto llega al corazón de las enumeraciones de Java: son enumeraciones orientadas a objetos, a diferencia de los "valores con nombre" que se encuentran en otros lugares.EDITAR: La especificación no es muy clara, pero la sección 8.9 establece:
fuente
Sí, es como si hubiera creado instancias singleton para cada valor en la enumeración:
Sin embargo , la
enum
construcción le brinda varios beneficios:switch-case
estructura de control.values
campo que se 'genera' para cada tipo de enumeraciónLa 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:
Usted puede abordar esta cuestión sin enumeración, utilizando una técnica que implica
writeReplace
yreadResolve
, (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.
fuente
== compara las referencias de dos objetos. Para las enumeraciones, se garantiza que solo habrá una instancia y, por lo tanto, para dos enumeraciones que sean iguales, == será verdadero.
Referencia:
http://www.ajaxonomy.com/2007/java/making-the-most-of-java-50-enum-tricks
(no pude encontrar nada en los documentos de Sun)
fuente
Aquí hay un código maligno que puede resultarle interesante. :RE
fuente
Unsafe.class
.Las enumeraciones son un gran lugar para bloquear código polimórfico.
fuente
Tenga en cuenta que hay un problema al transferir la enumeración a través de RMI / IIOP. Ver este hilo:
http://www.velocityreviews.com/forums/t390342-enum-equality.html
fuente
== generalmente está bien, y hay ventajas tanto para == como para
.equals()
. Personalmente prefiero usar siempre.equals()
al comparar objetos, incluidosenum
s. Vea también esta discusión:Comparando miembros de enumeración de Java: == o igual ()?
fuente