Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hier sieht man schön die entstehenden Probleme einer solchen equals-Implementierung:
Java:
public class Something {
private int attribute;
public Something(int attribute) {
this.attribute = attribute;
}
public boolean equals(Something other) {
if (other == null) {
return false;
}
if (other == this) {
return true;
}
if (other.attribute == this.attribute) {
return true;
}
return false;
}
public static void main(String[] args) {
Something s1 = new Something(42);
Something s1a = new Something(42);
Object s1a_2 = s1a;
Object s1b = new Something(42);
Something s2 = new Something(33);
// Erster kommentierter Wert: sind die Objekte gleich
// Zweiter Wert: Ausgabe der equals-Methode (sollte identisch zum
// erwarteten Wert sein)
System.out.println(s1.equals(s1a)); // true -> true
System.out.println(s1a.equals(s1)); // true -> true
System.out.println("---");
System.out.println(s2.equals(s1)); // false -> false
System.out.println(s1.equals(s2)); // false -> false
System.out.println("---");
System.out.println(s1a.equals(s1a_2)); // true -> true
System.out.println(s1a_2.equals(s1a)); // true -> true
System.out.println("---");
System.out.println(s1b.equals(s1a)); // true -> false
System.out.println(s1a.equals(s1b)); // true -> false
}
}
Solange man die Objekte typsicher eingibt passt alles, sogar der Aufruf mit dem gleichen Objekt als Object funktioniert (da dann die equals-Methode von Object aufgerufen wird, die bei gleichen Instanzen true zurückliefert).
Sobald du aber 2 semantisch gleiche Objekte hast welche unterschiedliche Objekte sind, und du übergibst diese nicht als Basistyp, sondern z.b. als Object, dann wird nicht deine Methode aufgerufen, sondern die von java.lang.Object, und diese kennt dein Attribut nicht.
Daher: equals() immer als "boolean equals(Object other)" implementieren und immer mit @Override Annotieren. Dann benötigt man zwar casts und instanceof-Abfragen, vermeided aber obige Fehler.
Hier sieht man schön die entstehenden Probleme einer solchen equals-Implementierung:
----
Solange man die Objekte typsicher eingibt passt alles, sogar der Aufruf mit dem gleichen Objekt als Object funktioniert (da dann die equals-Methode von Object aufgerufen wird, die bei gleichen Instanzen true zurückliefert).
Sobald du aber 2 semantisch gleiche Objekte hast welche unterschiedliche Objekte sind, und du übergibst diese nicht als Basistyp, sondern z.b. als Object, dann wird nicht deine Methode aufgerufen, sondern die von java.lang.Object, und diese kennt dein Attribut nicht.
Daher: equals() immer als "boolean equals(Object other)" implementieren und immer mit @Override Annotieren. Dann benötigt man zwar casts und instanceof-Abfragen, vermeided aber obige Fehler.