Gleichheit von Objekten
How To ...
Wie testet man die Gleichheit von Objekten?
Hintergründe
Zunächst muss die Gleichheit von Objekten definiert werden. Der Operator == testet zwei Referenzen, ob sie dasselbe Objekt referenzieren. Wenn getestet werden soll, ob zwei verschiedene Objekte gleich sind, so ist diese Gleichheit eine Frage der Fachlichkeit und somit auch fachlich zu definieren. Operational wird die Gleichheit dann mit der Methode equals() festgelegt, die in der Klasse java.lang.Object definiert ist und die Sie in Ihren Klassen erben und überschreiben können. Allerdings muss das Überschreiben bestimmten Bedingungen gehorchen.
So geht's
Die Methode equals() ist in java.lang.Object als
public boolean equals(Object obj) {
return (this == obj);
}
definiert. Mit dieser Definition sind zwei Objekte gleich, wenn sie ein und dasselbe Objekt sind. Um die Methode zu überschreiben, muss Ihre Implementierung die folgenden Eigenschaften haben:
- Symmetrie: Für zwei Referenzen x und y ungleich null: x.equals(y) genau dann wenn y.equals(x).
- Reflexivität: Für zwei Referenzen x und y ungleich null gilt: x.equals(x) ist true.
- Transitivität: Für drei Referenzen x, y und z ungleich null gilt: Wenn x.equals(y) und y.equals(z) dann auch x.equals(z).
- Konsistenz: Für zwei Referenzen x und y ungleich null liefert der wiederholte Aufruf von x.equals(y) entweder immer true oder immer false, falls keine Informationen, die zur Berechnung von equals() verwendet werden, sich ändern.
- Für jede Referenzen x ungleich null gilt: x.equals(null) liefert false.
Neben diesen Eigenschaften wird noch gefordert, dass die Methode hashCode() für zwei gleiche Objekte (nach obiger Definition) denselben Wert zurückliefert. In der Regel werden Sie also hashCode() überschreiben müssen, wenn Sie equals() überschreiben.
Da die Gleichheit von Objekten fachlich zu begünden ist, ist es sinnvoll, sich Beispiele anzuschauen. Bei Integer-Objekten ist es sicher richtig, dass zwei verschiedene Objekte, die dieselbe Integer-Zahl darstellen, gleich sind. Im folgenden Beispiel
System.out.println(new Integer(1) == (new Integer(1))); System.out.println(new Integer(1).equals(new Integer(1)));
evaluiert der erste Verleich zu false, der zweite zu true. Die Implementierung ist also fachlich korrekt. Die Implementierung von Integer.equals() ist
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
Da die Fachlichkeit diktiert, wie equals() zu implementieren ist, können wir keine weiteren Ratschläge geben. Für weitere Informationen zur Methode hashCode() schauen Sie bitte in die How-To Hash-Code eines Objekts
