2011-09-05 11 views
6

Java definisce un'interfaccia Set dove contains() è definito come segue:Istanza impostata in Java?

ritorni true se questo insieme contiene l'elemento specificato. Più formalmente, restituisce true se e solo se questo insieme contiene un elemento e tale che (o==null ? e==null : o.equals(e)).

L'interfaccia Collection definisce contains() come segue:

ritorni true se questa raccolta contiene l'elemento specificato. Più formalmente, restituisce true se e solo se questa raccolta contiene a almeno un elemento e tale che (o==null ? e==null : o.equals(e)).

Ho bisogno di un Java 'insieme istanza' dove si basa su == e non equals(). In altre parole, un insieme di istanze rigide in cui due diversi oggetti A e B in cui A.equals(B) potrebbero coesistere in questo stesso set, dal A!=B.

È un tale "set di istanze" consegnato in Java o in una libreria pubblica? Non riesco a trovare nulla, ma forse qualcuno lo sa meglio su SO. In caso contrario, lo implementerò. Grazie.

risposta

13

Non esiste un "set di istanze" diretto nel JRE.

Ma c'è un IdentityHashMap, che implementa una "mappa di istanze" in base alla terminologia.

E c'è un metodo chiamato Collections.newSetFromMap() che può creare un Set da un arbitrario Map attuazione.

Così si può facilmente costruire il proprio esempio impostare come questo:

Set<MyType> instanceSet = Collections.newSetFromMap(new IdentityHashMap<MyType,Boolean>()); 
+0

+1: più veloce di me. ;) –

+0

Sembra che questa sia la base di cui ho bisogno per il mio set di istanze. Grande. Grazie. – JVerstry

+1

L'OP dovrebbe tenere a mente che un "Set" implementato in questo modo è una violazione del contratto "Set" ... tanto quanto "IdentityHashMap" viola il contratto "Mappa". Ad ogni modo, questa è la probabile ragione per cui una classe del genere non è una parte standard del framework delle collezioni. –

1

si può solo implementare il metodo equals così:

public boolean equals(Obect o) { 
    return this == o; 
} 
+0

Vero, potrei, ma vorrei mantenere l'opportunità di implementare equals() in modo diverso. – JVerstry

+1

Ok :-) Solo un rapido heads up, direi che quasi * tutte * le collezioni controllano l'uguaglianza dei riferimenti prima di tentare di chiamare 'equals'. – dacwe

Problemi correlati