2012-10-12 299 views
11

La clase Collections tiene un número de métodos de ayuda estáticas para proporcionar vistas de sólo lectura de los diversos tipos de colección, como unmodifiableSet(), unmodifiableList(), etc. Para estos objetos de vista, la hashCode() y equals() métodos reenvía llamadas a la colección subyacente ... Con una extraña excepción: unmodifiableCollection().hashCode y es igual para Collections.unmodifiableCollection()

el Javadoc explicitly states:

La colección devuelta hace no pasar el hashCode y es igual a operaciones a través de la colección de respaldo, pero se basa en equals y hashCode métodos Object 's. Esto es necesario para preservar los contratos de estas operaciones en el caso de que la colección de respaldo sea un conjunto o una lista.

Mi pregunta: wtf está hablando? Si la colección de respaldo es un conjunto o una lista, esperaría un comportamiento consistente con unmodifiableSet() y unmodifiableList(). ¿Cómo violaría eso los contratos hashCode/equals?

Respuesta

14

Desde el Javadoc de Colección:

El contrato general para los estados Object.equals método que es igual debe ser simétrica (en otras palabras, a.equals (b) si y sólo si b. es igual a (a)). Los contratos para List.equals y Set.equals indican que las listas son solo iguales a otras listas y se establecen en otros conjuntos. Por lo tanto, un método personalizado es igual para una clase de colección que implementa La interfaz Lista o Conjunto debe devolver falsa cuando esta colección es en comparación con cualquier lista o conjunto. (Por la misma lógica, no es posible escribir una clase que implementa correctamente tanto el conjunto y la Lista interfaces.)

Un UnmodifiableList es un UnmodifiableCollection, pero el mismo no es cierto a la inversa - una UnmodifiableCollection que envuelve un List es no un UnmodifiableList. Entonces, si compara un UnmodifiableCollection que envuelve una Lista a con un UnmodifiableList que envuelve la misma Lista a, las dos envolturas no deben ser iguales. Si acaba de pasar a la lista envuelta, serían iguales.

Cuestiones relacionadas