2012-10-12 13 views
11

La classe Collections ha un certo numero di metodi di supporto statici per fornire sola lettura viste vari tipi di raccolta, come unmodifiableSet(), unmodifiableList(), ecc Per queste sottofinestre, il hashCode() e equals() metodi inoltra le chiamate alla raccolta sottostante ... Con una sola eccezione: unmodifiableCollection().hashCode e uguale per Collections.unmodifiableCollection()

Il JavaDoc explicitly states:

La collezione restituita non non passare il hashCode e uguale operazioni fino alla raccolta di supporto, ma si basa su equals e hashCode metodi Object s'. Questo è necessario per preservare i contratti di queste operazioni nel caso in cui la raccolta di fondi sia un insieme o un elenco.

La mia domanda: wtf sta parlando ?? Se la raccolta di accompagnamenti è un set o un elenco, mi aspetterei un comportamento coerente con unmodifiableSet() e unmodifiableList(). Come potrebbe violare i contratti hashCode/Equals?

risposta

14

Dal JavaDoc per la raccolta:

Il contratto generale per il metodo stati Object.equalsQ che equivale deve essere simmetrica (in altre parole, a.equals (b) se e solo se b. equals (a)). I contratti per List.equals e Set.equals indicano che gli elenchi sono uguali ad altri elenchi e si imposta su altri set. Pertanto, un metodo uguale a uguale per una classe di raccolta che non implementa né l'Elenco né l'interfaccia Set devono restituire false quando questa raccolta è rispetto a qualsiasi elenco o insieme. (Con la stessa logica, non è possibile scrivere una classe che implementa correttamente sia il set e List interfacce.)

Un UnmodifiableList è un UnmodifiableCollection, ma lo stesso non è vero in senso inverso - una UnmodifiableCollection che racchiude un List è non un UnmodifiableList. Quindi, se confronti uno UnmodifiableCollection che avvolge un elenco a con uno UnmodifiableList che avvolge lo stesso elenco a, i due wrapper non dovrebbero essere uguali. Se hai appena passato alla lista incartata, sarebbero stati uguali.

Problemi correlati