2012-09-16 24 views
8

Si es necesario utilizar un Class<T> como parte de una clave de Map, ¿cuál es la forma correcta de definir hashCode y equals?
Un Class<T> hereda los de Object el que comprobar la igualdad de referencia y devolver la dirección de memoria que el código hash pero en mi mente que no está claro cuál es la definición significativa de equals y hashCode definición de un Class<T>.
¿Debo usar theClass.getClass().hashCode(); por ejemplo (donde tenemos Class<T> theClass;) para usar los métodos de la instancia real?
Pero esto no parece ser lo correcto.
Por ejemplo en el javadoc para Class<T>:¿Cómo definir significativamente hashCode y es igual para java.lang.Class <T>?

Cada matriz también pertenece a una clase que se refleja como un objeto de clase que es compartida por todas las matrices con el mismo tipo de elemento y número de dimensiones

Parece que en algunos casos el mismo Class<T> se comparte entre los objetos? Entonces, ¿cuál sería la manera de seguir? ¿Quizás use theClass.hashCode() y theClass.equals() para usar la igualdad de referencia? No estoy seguro en absoluto aquí.

+0

No hay nada que definir, ya que hashcode y equals ya están implementados, y me cuesta imaginar cómo y aún más difícil imaginar por qué cambiaría esa implementación. –

+0

@JensSchauder: al usar Eclipse para generar 'hashCode' y' equals' automáticamente, se produjo una advertencia quejándose de que 'hashCode' y' equals' no están definidos para 'Class'. Esto me preocupaba si era una advertencia válida y si debería hacer algo al respecto – Cratylus

+0

No sé lo que intenta hacer, pero 'Class' es una clase que forma parte de java. No puedes implementar nada para eso. ¿Cuál es el nombre completo del archivo fuente donde intenta agregar hashCode y equivale? –

Respuesta

8

La implementación de hashCode y equalsjava.lang.Class hereda de java.lang.Object es significativo y por lo general apropiada, como todas las instancias de una clase están garantizados para devolver el mismo objetoClass de getClass(), es decir

new Integer(2).getClass() == new Integer(3).getClass(); 

Esto es algo enterrado en los documentos; la javadoc of getClass() escribe:

Devuelve:

el objeto de clase que representa la clase de tiempo de ejecución de este objeto.

Ver también:

literales, sección 15.8.2 de The Java Language Specification ™.

That section escribe:

Una clase evalúa literales a la clase de objeto para el tipo de llamada (o para void) tal como se define por el cargador de clase de definición (§12.2) de la clase de la instancia actual .

y section 12.2 escribe:

cargadores de clases Buen comportamiento mantienen estas propiedades:

  • Dado el mismo nombre, un buen cargador de clases siempre debe devolver el mismo objeto de clase.
  • ...

Un cargador de clases malintencionado podría violar estas propiedades. Sin embargo, no podría socavar la seguridad del sistema de tipos, porque la máquina virtual Java protege contra esto.

Y sí, si los cargadores de diferentes clases cargan la misma definición de clase, los objetos de la clase no serán iguales. Como el tiempo de ejecución los considera como clases independientes (que casualmente comparten el mismo nombre, pero que de otro modo no deberían ser similares, y mucho menos binarios), esto generalmente se desea.

+0

Nota al respecto: aplicaciones como Tomcat utilizan un cargador de clases jerárquico y esto puede morderlo. Tomcat le da a todas sus aplicaciones su propia pila de cargador de clases. –

0

El método String getName() devuelve único Cadena de representación de la clase. Puede usar esta Cadena para equals/hashCode como una Cadena ordinaria si su programa no usa más de un cargador de clases.

+0

Pero no lo hago 'Mapa , T>'. Mi pregunta es cuando 'Clase ' es ** parte ** de una clave. No la clave en sí – Cratylus

+0

@Cratylus La respuesta es la misma; utiliza getName() que devuelve una representación de cadena única del objeto Class; usa esta cadena en hash/equal como si fuera un campo de instancia String. – m3th0dman

Cuestiones relacionadas