Wieso ist diese eigene Equals-Methode schlecht?

SexyPenny90

Mitglied
Hallo,

ich habe folgende equals-Methode geschrieben:
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;
    }
}

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?

mfg Penny
 
Zuletzt bearbeitet:

nrg

Top Contributor
ne die ist imho völlig ok. wenn die referenz gleich ist, ist es auch das gleiche objekt.

[EDIT]
ne doch nicht ;). signatur ist falsch. nutz @override dann passiert sowas nicht[/EDIT]
 

Phash

Top Contributor
== bedeutet identisch.

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
 

nrg

Top Contributor
nein ist sie nicht. die methodensignatur ist falsch.

Java:
	@Override
	public boolean equals(Object obj) {
		if (obj == this) return true;
		if (obj == null) return false;
		if (getClass() != obj.getClass()) return false;
		
		return attribute == ((Something)obj).attribute;
	}
 

Tobias1501

Neues Mitglied
Java:
class Something
{
    private int attribut;
    
    @Override
    public boolean equals(Object other)
    {
        if (other instanceof Something)
        {
            Something SomeOther = (Something)other;
            return this.attribut == SomeOther.attribut;
        }
        return false;
    }

    @Override
    public int hashCode() 
    {
        return this.attribut;
    }
}

So müsste das funktionieren.
 

SexyPenny90

Mitglied
Ich verssteh nicht ganz wieso das nicht so geht.

Wenn ich ne klasse schreiben die so aussieht:

Java:
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?
 

Camill

Bekanntes Mitglied
Hier z.B.:
Java:
Something st1 = new Something(23);
Object st2 = new Something(23);
System.out.println(st1.equals(st2));

Ergibt false da nicht deine equals-Methode aufgerufen wird - etwas anderes fällt mir adhoc nicht ein.
 
G

gst

Gast
Was genau hindert dich daran, einfach mal die Doku zu lesen, wie eine equals-Methode auszusehen hat?

Object#equals

Ergänzend zu den Anmerkungen der anderen fehlt hier auch eindeutig die überschriebene hashCode-Methode.

Insgesamt mal wieder ein typischer Fall von RTFM
 

nrg

Top Contributor
nö, wenn man das Überschreiben von equals lernt dann gleich richtig ...

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..
 
G

gst

Gast
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...
 

faetzminator

Gesperrter Benutzer
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.
 

mvitz

Top Contributor
Das stimmt in diesem Falle. Wenn die Klasse Foo allerdings final wäre, dann spart einem instanceof eine Überprüfung auf null und stimmt trotzdem immer :)

Dementsprechend gibt es für eine Equals-Methode zwei Varianten:

Finale Klasse
Java:
@Override
public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (!(o instanceof MyClass)) {
        return false;
    }
    MyClass other = (MyClass) o;
    // Eqaul Vergleich der Attribute
}

Nicht-finale Klasse
Java:
@Override
public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (o == null) {
        return false;
    }
    if (!getClass().equals(o.getClass())) {
        return false;
    }
    MyClass other = (MyClass) o;
    // Eqaul Vergleich der Attribute
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ZH1896ZH Wieso diese Ausgabe?? Java Basics - Anfänger-Themen 10
L Input/Output Wieso kommt diese Ausgabe? Java Basics - Anfänger-Themen 12
A Wieso kann ich nicht auf diese Variable zugreifen? Java Basics - Anfänger-Themen 6
A Erste Schritte Wieso funktioniert diese Klasse nicht Java Basics - Anfänger-Themen 11
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
H Interface Wieso "List<String> list = new ArrayList<>[…]" Java Basics - Anfänger-Themen 4
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
sserio Wieso funktioniert mein Programm nicht Java Basics - Anfänger-Themen 2
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
sserio Wieso funktioniert mein TableView nicht /JavaFX. Java Basics - Anfänger-Themen 4
N Wieso funktioniert die Deklaration nicht Java Basics - Anfänger-Themen 3
Zrebna Umgebungsvariable Wieso wird meine verwendete JDK-Version in der Prompt nicht erkannt? Java Basics - Anfänger-Themen 6
F Wieso wird immer die falsche Mausposition angegeben? Java Basics - Anfänger-Themen 1
C Objekt1.equals(Objekt2) = immer false. Wieso? Java Basics - Anfänger-Themen 22
A Wieso bekomme ich hier zwei unterschiedliche Ausgaben? Java Basics - Anfänger-Themen 6
J Fehler im Code, aber ich weiß nicht wieso! Java Basics - Anfänger-Themen 6
W Wieso funktioniert mein Switch Case nicht ?! Java Basics - Anfänger-Themen 9
D Interface Wieso Aufruf aller Methoden eines Interfaces? Java Basics - Anfänger-Themen 11
F Wieso wird dieser Befehl nicht ausgeführt? (Anfänger) Java Basics - Anfänger-Themen 2
H Datentypen 64 Bit passt in 32 Bit, wieso? Java Basics - Anfänger-Themen 9
H Wieso wird mir ein Fehler angezeigt? Java Basics - Anfänger-Themen 5
H Wieso öffnet sich der Texteditor? Java Basics - Anfänger-Themen 6
ChrisPL4Y Wieso funktioniert dieses Programm nicht? Java Basics - Anfänger-Themen 6
B Wieso wird die Zeile "column" genannt und die Spalte "line"? Java Basics - Anfänger-Themen 12
B Wieso wird hier so viel als falsch angezeigt? Java Basics - Anfänger-Themen 2
B Wieso gibt er hier nur die ungeraden Zahlen aus? Java Basics - Anfänger-Themen 5
B Wieso gibt das Programm in der Console kein Ergebnis aus? Java Basics - Anfänger-Themen 2
A Wieso charAt(0) + charAt(3) = INT-Wert? Java Basics - Anfänger-Themen 5
H NullPointerException, aber wieso? Java Basics - Anfänger-Themen 5
P Cannot find symbol, wieso? Java Basics - Anfänger-Themen 5
K Wieso muss man finale statische Variablen sofort oder eben im Konstruktor initialisieren? Java Basics - Anfänger-Themen 2
F Operatoren Wieso fliegt hier eine NullPointer Exception :( Java Basics - Anfänger-Themen 3
Z JPanel wird zweimal hinterinander gezeichnet.. Wieso? Java Basics - Anfänger-Themen 4
T Wieso kann ich das jar file nicht starten? Java Basics - Anfänger-Themen 5
S Wieso wird mein JFrame transparent dargestellt? Java Basics - Anfänger-Themen 5
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
A Wieso übergibt der nicht die bearbeitete txt file Java Basics - Anfänger-Themen 8
Z Lotto-Programm Wieso klappt das? Java Basics - Anfänger-Themen 8
P Compiler-Fehler wieso zeigt der compiler ein else without if? Java Basics - Anfänger-Themen 3
S OOP Die Methode funktioniert, aber wieso? Java Basics - Anfänger-Themen 2
X Connection reset, wieso? Java Basics - Anfänger-Themen 4
T Objektorientierte Programmierung - Kein Plan wieso das nicht funktioniert! Java Basics - Anfänger-Themen 6
A Bild verschwindet! Wieso?? Java Basics - Anfänger-Themen 2
A Wieso funktioniert dieser Timer nicht?? Java Basics - Anfänger-Themen 3
A Wieso denn das??? Java Basics - Anfänger-Themen 2
A Wieso erscheinen die Objekte manchmal und manchmal nicht Java Basics - Anfänger-Themen 2
R Wieso funktioniert dieses Array nicht? Java Basics - Anfänger-Themen 13
S Methoden void-Methode: Wieso gibt es eine Rückgabe? Java Basics - Anfänger-Themen 5
X Stack mit Oberklasse, wieso funktioniert es nicht? Java Basics - Anfänger-Themen 8
C Klassen Wieso kein infiniter Regress? Java Basics - Anfänger-Themen 4
M ArrayList - remove() löscht nicht! - weiß nicht wieso! Java Basics - Anfänger-Themen 8
X Wieso mehrere JRE ordner? Java Basics - Anfänger-Themen 8
J Regex Ausdrücke im Array - Wieso werden sie nicht erkannt? Java Basics - Anfänger-Themen 4
A Wieso wird immer 0 ausgegeben? Java Basics - Anfänger-Themen 4
R Wieso hat ein Konstruktor keinen Rückgabetyp? Java Basics - Anfänger-Themen 6
T JTable wird nicht erzeugt, wieso? Java Basics - Anfänger-Themen 17
S JTable removeRow() IndexOutOfBounceException - wieso? Java Basics - Anfänger-Themen 3
S wieso Fehlermeldung cannot find symbol hier Java Basics - Anfänger-Themen 10
N NumberFormatException, aber wieso? Java Basics - Anfänger-Themen 5
E Wieso funktioniert Boolean.parseBoolean(s) nicht? Java Basics - Anfänger-Themen 9
T Wieso kompiliert das? Java Basics - Anfänger-Themen 7
B Erste Schritte Programm kompiliert nicht. Wieso? Java Basics - Anfänger-Themen 14
Luk10 Wieso bricht die Rekursion nicht ab? Java Basics - Anfänger-Themen 3
B Warnung : Dead Code. Aber wieso? Java Basics - Anfänger-Themen 10
W Compiler-Fehler NullPointerException. Aber wieso? Java Basics - Anfänger-Themen 2
C Conways Game of Life / "Waldbrandsimulation": wieso temporäres Hilfs-Array?! Java Basics - Anfänger-Themen 8
R If-Abfrage liefert false zurück, wieso ? Java Basics - Anfänger-Themen 20
K Methode funzt nicht, wieso? Java Basics - Anfänger-Themen 12
H Wieso ist das eine Endlosschleife? Java Basics - Anfänger-Themen 8
R wieso Nullpoint und was mit Events ? Java Basics - Anfänger-Themen 14
C Wieso funktioniert das Array nicht? Java Basics - Anfänger-Themen 10
R Wieso hänge ich hier in einer Endlosschleife (vermute ich zumindest)? Java Basics - Anfänger-Themen 2
M Wieso funktioniert dieser simple Code nicht? Java Basics - Anfänger-Themen 9
J Wert wird überschrieben, weiß nicht wieso Java Basics - Anfänger-Themen 2
S wieso ist mein Code falsch? Java Basics - Anfänger-Themen 2
D array.toString() wieso funktioniert es nicht Java Basics - Anfänger-Themen 4
A Wieso terminiert das Programm nicht? Java Basics - Anfänger-Themen 4
B Wieso ein Fehler? illegal Starts of expression? Java Basics - Anfänger-Themen 12
radiac Wieso bekomme ich kein Bild drauf??? Java Basics - Anfänger-Themen 13
Hatebreed Keine Datenbankverbindung, wieso? (ClassNotFoundEscpetion) Java Basics - Anfänger-Themen 18
U Anfänger Frage - Ausgabe funktioniert nicht - Wieso? Java Basics - Anfänger-Themen 10
G Wieso enum Declaration nur außerhalb einer Methode möglich? Java Basics - Anfänger-Themen 9
S Wieso funtkioniert das SQL DELETE nicht? Java Basics - Anfänger-Themen 1
K Wieso schaltet meine CheckBox von selbst um ? Java Basics - Anfänger-Themen 31
fill0soph Wieso ist "Minus-Unendlich" == 1? Java Basics - Anfänger-Themen 4
G Wieso werdne die componentne nciht angezeigt Java Basics - Anfänger-Themen 4
B Primzahlen berechnen - Wieso unterschiedliche Java Basics - Anfänger-Themen 3
K Wieso wird "paint" nicht ausgeführt ? Java Basics - Anfänger-Themen 2
F Wieso java.lang.StackOverflowError (minimales programm) Java Basics - Anfänger-Themen 11
G Wieso eine nullpointerexception? Java Basics - Anfänger-Themen 6
G Wieso ist eine String-Übergabe keine by-reference-Zuweisung? Java Basics - Anfänger-Themen 7
K Wieso kommt ne NullPointerException Java Basics - Anfänger-Themen 3
N Wieso final ? Java Basics - Anfänger-Themen 4
H wieso syntax error bei else ? Java Basics - Anfänger-Themen 3
H wieso fehler ? must return a type of int. Java Basics - Anfänger-Themen 4
F Wieso werden Char-Werte wie Zahlen addiert? Java Basics - Anfänger-Themen 5
M Wieso zeichnet es nicht auf den JPanel Java Basics - Anfänger-Themen 7
V Wieso NullPointerException Java Basics - Anfänger-Themen 7
M Wieso finden andere nicht die main .class Java Basics - Anfänger-Themen 20

Ähnliche Java Themen

Neue Themen


Oben