Faq (fürs Wiki): Object.equals(), String.equals(), ==, equals() und Vergleich Referen


#21

http://wiki.byte-welt.net/wiki/Object.equals(),String.equals(),%3D%3D,_equals()und_Vergleich_Referenz_und_Inhalt
und
http://wiki.byte-welt.net/wiki/Equals(),
%3D%3D_und_Identit%C3%A4t_und_Gleichheit
bitte löschen.

Die Überschrift ist jetzt ==, equals() und Identität und Gleichheit

Danke noch mal


#22

[QUOTE=iKnwWhtUDidLast]
a) Ich wollte im Konstruktor nur andeuten (siehe // …), dass dort normalerweise Variablen übergeben werden, eine Prüfung auf null fehlt allerdings.

b) Es geht doch nur um den genauen inhaltlichen Vergleich von zwei Objekten, die api doc gibt auch nur Empfehlungen, beides gleichzeitig zu überschreiben/zu implementieren.

c) Das ist eine offene Frage, ob Instanzen von sub classes auch gleich der Oberklasse sein können oder nicht. Die IDE verwendet standardmäßig aber getClass().

d) Wieso nicht…

Also, wenn ich Zugang zum Wiki habe, stelle ich’s selber rein.[/QUOTE]

zu a) deute es nicht an, schreib es hin: das soll ein Übersichtsartikel für Anfänger sein!

zu b) das ist keine Empfehlung, das ist in der Praxis ein MUSS

zu c) du nimmst den von der IDE generierten Code und machst einen Artikel daraus??

zu d) überflüssiger Text, verwirrt nur, ist völlig sinnlos an der Stelle, lenkt ab…

Ich habe wirklich wenig Lust, deine Einträge im Wiki zu verbessern, da wird man ja nie fertig

Ohne dass man es angibt oder nicht, erben alle (selbst geschriebenen) Klassen implizit von der Klasse java.lang.Object . In Object ist die Methode equals(Object obj) deklariert/definiert:

ist völlig verblasen. Warum “Ohne dass man es angibt oder nicht”, das steht doch eh da.

Alle Klassen erben von java.lang.Object. Diese enthält die Standardimplementierung von equals:

Wie zu sehen ist, überprüft diese Methode auf referenzielle Gleichheit (Identität). Der Wert zweier Variablen ist nur identisch, wenn es sich um ein und dasselbe Objekt handelt (Datentyp: Referenz-Typ), also zwei Variablen dasselbe Objekt referenzieren/zeigen.

Oft will man aber den Inhalt von zwei Objekten vergleichen (inhaltliche Gleichheit (= Gleichheit)). Damit ist z. B. die Gleichheit aller Attribute/Objektvariablen von zwei Objekten/Klassen/Variablen gemeint. Deshalb muss die Methode equals() aus Objekt überschrieben werden. Standardmäßig überschreiben auch “alle” Klassen der Java-SE-API diese Methode und geben eine richtige Implementierung / ein richtiges Verhalten vor. Beispiel String

ist auch so irre.

(inhaltliche Gleichheit (= Gleichheit))

Willst du das möglichst verwirrend gestalten oder was? Der Artikel sollte doch gerade erklären, was der Unterschied zwischen “inhaltlicher Gleichheit” und “==” überhaupt ist.

Damit ist z. B. die Gleichheit aller Attribute/Objektvariablen von zwei Objekten/Klassen/Variablen gemeint.

Der Satz setzt voraus, dass irgendwie klar ist, ob die Attribute mit == oder equals verglichen werden soll. Hier verwendest du einfach das Wort “Gleichheit”, so als ob das klar wäre. Ist es aber nicht, genau das soll dein Artikel doch klären.

Deshalb

Nein, nicht “deshalb”. Es ist eine semantische, eine Designentscheidung ob nicht == das “richtige” ist, das hängt vom Kontext ab.

Standardmäßig überschreiben auch “alle” Klassen der Java-SE-API diese Methode und geben eine richtige Implementierung / ein richtiges Verhalten vor.

Was soll ein Anfänger mit den Anführungszeichen bei “alle” anfangen? Es gibt kein richtiges Verhalten, es gibt nur ein zweckmässiges Verhalten.

Und dann das Beispiel mit den Strings. Warum ausgerechnet die? Weil da die Compilertricks alles so schön kompliziert machen. Hättest du auch gleich Integer nehmen können, bei denen == für Zahlen zwischen -128 und 127 sogar funktioniert…

Warum nimmst du kein wirklich elementares Beispiel?

class A { private int a; ...}

und erklärst einfach kurz und bündig, was der Unterschied zwischen == und .equals ist?


#23

Jaa… ich finde auch, dass es gut ist, “größere” neue Wiki-Seiten erstmal hier zu besprechen. Insbesondere wenn so viele (berechtigte!) Verbesserungsvorschläge kommen. Den aktuellen Artikel … ja, da müßte man halt nochmal drübergehen… (räusper). Es kommt sicher auch darauf an, an wen sich das richtet. Wenn hier jemand schreibt: “Hilfe, ich hab zwei Objekte, die sind gleich, aber == liefert false” (oder “…equals liefert false”) dann ist der Hinweis auf den Vergleich mit ‘equals’ bzw. wie die Methode zu überschreiben ist, sicher richtig. Aber man kann da sehr weit gehen: http://www.angelikalanger.com/Articles/EffectiveJava/01.Equals-Part1/01.Equals1.html
Potentiell jeden schon im Wiki stehenden Artikel reviewen zu müssen wäre etwas lästig, da müßten wir uns mal was überlegen…


#24

Es bleibt erst mal bei dem einen Artikel im Wiki von mir

An eurer Kritik kann ich nichts nachvollziehen, lediglich, wie das mit dem Zitieren funktioniert, weiß ich nicht

Anstatt zu Loben, dass ich erst mal vorher nachfrage, kommt gleich das gestänker

ich erhebe keinen Anspruch darauf, das dies wichtige Thema nicht durch einen besseren Beitrag ersetzt werden könnte

Bitte löscht diesen Thread hier http://forum.byte-welt.net/showthread.php?t=4797 es kommt nichts Wichtiges dabei rum, @Bleiglanz würde mich am liebsten sowieso zerfleischen


#25

Übertreib’ nicht. Selbst wenn du den Artikel von Angelika Langer geschrieben hättest, hätte jemand was dran auszusetzen. Es geht ja nur darum, dass im Wiki was steht, wo alle einigermaßen zustimmen.