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.
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;
}
}
Angeblich, soll es bei gewissen Szenarien Probleme geben. Liegt das dann an der Zeile :
if (other == this) { return true; }
, weil nur die Objekte überprüft werden und nicht der Inhalt der Attribute?
Identisch: Zwei Objekte sind identisch, wenn sie beide das selbe Objekt (exakt am selben Ort im Speicher) referenzieren, was mittels "==" getestet wird. In der Objektorientierung heißt das auch, dass diese eine gemeinsame Instanz haben. Stellen Sie sich das einfach so vor, als wenn Hausnummern in einer Stadt verglichen werden: Die Hausnummern sind zwar gleich, aber es können verschiedene Leute im Haus wohnen.
Wenn du vergleichen willst, ob sie gleichen Inhalts sind, aber nicht identisch, dann musst du die einzelnen Variablen vergleichen
public class Testequal{
public static void main(String[] args) {
Something other = new Something(123);
Something something = new Something(12);
Boolean equals = something.equals(other));
}
}
wird doch kein falsches Ergebnis raus kommen. Bei welchem Bsp. würde den ein Fehler auftreffen?
kommt halt ganz drauf an, was man mit der klasse machen will. eine hashcode ohne equals macht wenig sinn, da geb ich dir recht. aber wenn man instanzen der klasse lediglich auf gleichheit überprüfen will, genügt auch nur die equals.
wenn man natürlich code schreibt, der von dritten verwendet wird, sollte man immer beides tun..
Klar, wenn man so argumentiert braucht man sich so ziemlich jedes vernünftige Programmieren erst gar nicht angewöhnen. Schließlich weiß man Glaskugel sei Dank ja ganz genau, dass der eigene Code für alle Ewigkeiten so bleibt, nie von einem selbst oder anderen verwendet wird und, um wieder auf equals/hashCode-Problematik zurückzukommen, irgendwelche Objekte auch niemals in Hash-basierten Sets oder Maps landen werden...
Tobias1501: Der Code mit [c]instanceof[/c] gegenüber [c]getClass().equals(...)[/c] würde gegen die Regeln verstossen. Wenn du da nämlich [c]Foo[/c] und [c]Bar -> Foo[/c] hättest, würde bei in Foo bekannten, korrekten Werten [c]Foo#equals()[/c] [c]true[/c] und [c]Bar#equals()[/c] [c]false[/c] liefern, korrekt wär aber [c]false[/c] in beiden Klassen.