2010-09-07 13 views
9

Es gibt ein Java-Bean-Objekt, das die Funktion equals basierend auf bestimmten Kriterien (Kriterium A) implementiert hat. Ich habe die Anforderung, eindeutige Objekte basierend auf einem anderen Kriterium (Kriterium B) zu identifizieren. Da die Funktion equals die Kriterien A verwendet, kann ich HashSet nicht verwenden. Also dachte ich an TreeSet mit meiner benutzerdefinierten Comparator, die auf Kriterien B basiert. Meine Frage ist, ist es erlaubt, so zu tun? Irgendwelche Probleme mit diesem Ansatz?TreeSet- und equals-Funktion

Vielen Dank. Hier

Antwort

14

sind einige Führer von Oracle Java:

Beachten Sie, dass die Bestellung von einem Satz beibehalten (mit oder ohne einen expliziten Komparator vorgesehen ist) muss mit equals konsistent, wenn es zu ist richtig implementieren Sie die Set-Schnittstelle. (Siehe Vergleichbare oder Vergleicher für eine genaue Definition im Einklang mit ist gleich). Das ist so, weil die Set Schnittstelle in Bezug auf die gleich Operation definiert ist, sondern eine TreeSet Instanz führt alle Schlüsselvergleiche seine compareTo mit (oder vergleichen Sie) Methode, so zwei Schlüssel, die gleichen durch diese Methode sind, sind aus dem Standpunkt des Satzes, gleich. Das Verhalten eines Satzes ist wohldefiniert sogar , wenn seine Reihenfolge nicht konsistent ist mit equals; es entspricht nur nicht dem allgemeinen Vertrag der Set-Schnittstelle.

Ich denke in Bezug auf technische, nein, Sie haben keine Probleme. Aber in Bezug auf Kodierung, Lesbarkeit und Wartbarkeit müssen Sie vorsichtig sein, weil andere Menschen missbrauchen oder missverstehen können, was Sie gerade tun.

1

Wenn Sie die Suche oft ausführen und Elemente selten hinzufügen, sollten Sie sie in einer List sortierten nach sortieren Kriterium B und Verwendung Collections.binarySearch.

1

Sie können sie wickeln:

class BeanWrapper { 

... 

public boolean equals(Object other) { 
    return myBean.critB.equals(((Bean)other).critB); 
} 

} 

Und sie so in den Satz setzen.

Verwandte Themen