2010-11-26 19 views
5

A veces incluso puede que no sepa que el entorno en el que conecta el código tiene más de un cargador de clases. ¿Puedo esperar que la operación "==" funcione en valores enum en este caso?enum vs. cargadores de clases

Respuesta

-5

"==" no funciona, pero desea utilizar .equals() de todos modos.

que podría estar interesado en el apache commons clase lang: link text

+1

La pregunta es: would 'equals()' work? –

+1

BTW, implementación de Enum 'equals()' solo llama a 'this == other' (Sun/Oracle JDK 6). –

+0

sí, como acabo de escribir en mi propia respuesta –

11

múltiples cargadores de clases no puede ser el problema, siempre y cuando la enumeración sólo está disponible a través de uno de ellos. Si ese no es el caso, perderá todos los beneficios de una enumeración.

Y por cierto, usar equals() tampoco ayuda. Aquí está la implementación de Enum.equals(Object) en Java 1.6:

public final boolean equals(Object other) { 
    return this==other; 
} 
+0

Lo mismo aquí que en la publicación de josefx; aún puede funcionar cuando varios cargadores de clases cargan una enumeración, solo debe tener cuidado de que estén aislados el uno del otro. –

+0

Claro, pero es un dolor. Rompe cualquier suposición que uno tenga sobre las enumeraciones. Y rompe el patrón enum Singleton. –

+5

Los cargadores de clases rompen todos los patrones de singleton. – josefx

8

Si la clase de enumeración sólo se carga una vez que seguirá funcionando.

  • su enumeración es únicamente de uso el plugin cargado
  • la enumeración se ha cargado por un cargador de clases padre de los cargadores de clases de plugin individuales

Si la clase de enumeración es cargado por diferentes cargadores de clases se no funcionará

  • usted pasa los valores enum entre los diferentes plugins pero la aplicación cla ssloader no ha cargado la enumeración. (Ésta puede funcionar si los valores de enumeración nunca se cruzan entre plugins)

La razón por la que es de esta manera

Java utiliza instancias de objetos para representar los diferentes valores de enumeración, cada uno de estos casos se almacena como un campo estático dentro de la clase enum. Si la enumeración se carga dos veces, cada valor enum se representa con dos instancias de objetos diferentes. El == operator solo compara las referencias y no tiene conocimiento de las múltiples instancias que representan un valor enum, por lo que no coincidirá con los valores cargados por diferentes cargadores de clases.

+0

"El operador == solo compara las referencias" suena un poco como un dogma. Enum ya es algo muy especial. Una especialidad más podría definir "==" como "this.ordinal() == that.ordinal()". ¿Podría eso resolver el problema? – Dima

+0

@Dima, siempre que ambas definiciones cargadas de la enumeración sean idénticas, funcionará. El valor ordinal solo contiene el índice (posición) de la constante Enum en el código fuente, si el código cambia (valores nuevos, ordenamiento diferente) aún se rompería. Si la velocidad no es un problema, puede comparar sus nombres. – josefx