Ist es möglich, Object#equals(Object)
lokal zu überschreiben, wenn list.contains(someObject)
verwendet wird?Überschreibendes Objekt # ist gleich (Objekt) außerhalb der Klasse
Beispiel:
class SomeObject {
...
private int id;
private String name;
@Overrdide
public boolean equals(Object other){
...
return this.id == other.id;
}
}
Aber was, wenn ich eine andere Art von Gleichen will, wenn ich list.contains(someObject)
verwenden? Zum Beispiel möchte ich wissen, ob eine Liste einen bestimmten Namen enthält? Ist es möglich, Object#equals(Object)
'anonym' zu überschreiben?
Speziellere Erklärung, warum ich es brauchen würde:
int objectId = ... // Some event which passes me the attribute of an object but not the object itself
Jetzt habe ich List<SomeObject> someObjects
und ich würde gerne wissen, ob diese Liste ein Objekt mit objectId
enthält, ohne notwendigerweise über sie iterieren.
One „Lösung“ Ich könnte denken würde Map<Integer, SomeObject> mapping
verwenden und dann someObject = mapping.get(objectId)
EDIT: Meine Frage ist kein Duplikat, da ich speziell Object#equals(Object)
außer Kraft zu setzen bin zu fragen.
Es sollte sein, aber das ist IMHO das Schlimmste an der Sammlung API. Sie können einen benutzerdefinierten Vergleicher an vielen Stellen verwenden, aber Sie sind mit nur einer Vorstellung von 'equals' festgefahren. –
Wenn Java nur Fallklassen hatte :-( – SklogW
Die Verwendung eines Vergleichers zur Angabe der Gleichheit funktioniert für einen Satz und für Map-Schlüssel (aber es beeinträchtigt die Leistung - Operationen werden zu O (log n), weil Sie TreeMap anstelle von HashMap verwenden müssen). Es hilft jedoch nicht mit List.Es könnte möglich sein, einen benutzerdefinierten Begriff der Gleichheit mit Methoden wie 'indexOf',' contains' usw. zu verwenden, aber es ist nicht möglich, ohne eine Wrapper-Klasse zu erstellen und gleich zu überschreiben, wie Sie wollen ärgerlich. –