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.
Wie würde das in dem Beispiel von oben denn aussehen?
Werden dann die Autos nach Anzahl der Türen und Räder sortiert? Und wie genau? Und was bedeutet dann ein Auto ist größer bzw. kleiner als das andere, bezogen auf Türen und Räder?
Vielleicht geht es dem Poster ja eher um einen Filter?!?
Die Sortierung wäre doch egal, wenn man sich auf den 0 Rückkgabewert konzentriert, d.h. ob sie gleich sind.
Er könnte aber auch eine Wichtung der Attribute einführen, um sortieren zu können, zB. eine Tür ist mehr Wert als ein Reifen.
Natürlich tut es auch eine statische Methode mit eigener Schnittstelle (Rückgabewert boolean und 2 Autos als Parameter).
Oder eben die Equals Methode, wenn es sich um Value Objects handelt.
Wenn ich immer definieren kann, dass Autos mit der gleichen Reifenzahl als gleich erkannt werden sollen, dann kann ich equals benutzen. Wenn ich jetzt mit variiere (mal Reifen, mal Türen, mal beides), dann ist die Konsistenzregel verletzt.
Noch mal der Tipp: du brauchst einen Filtermechanismus, der zwar auch vergleichen muss, aber der nichts mit compare und nichts mit equals zu tun hat.
P.S.: wer equals überschreibt muss auch hashCode überschreiben!!!
Eine gute IDE (z.B. Eclipse) kann dir automatisch die equals()- und hashCode()-Methoden erzeugen. Du wählst nur die relevanten Attribute aus und fertig.
//boolean, nicht Boolean
//Object statt auto
public boolean equals(Object o) {
if (o instanceof Auto) {
Auto auto = (Auto) o;
return this.reifen.equals(auto.getReifen()) &&
this.tür.equals(auto.getTür()); // usw für alle relevanten Eigenschaften
} else {
return false; //o ist kein Auto -> ungleich
}
}
"If two objects are equal according to the equals(Object)method, then calling the hashCode method on each of the two objects must produce the same integer result."
Mit anderen Worten: Wen equals sagt "die sind gleich", darf hashCode nicht zwei unterschiedliche Werte liefern. Das ist wichtig für HashMap, HashSet und andere Container Klassen (und überall da, wo sich jemand auf eine ordentliche hashCode-Implementierung verläßt).
Wie von tfa schon gesagt, gibt es IDEs, die das für dich übernehmen.
Wenn niemand sonst niemals nicht deine Klasse zu Gesicht bekommt (und du sie auch nicht in eine der erwähnten Collections packen willst), kannst du hashCode natürlich auch sein lassen - es ist aber trotzdem schlechter Stil.
Wenn deine equals-Methode nur auf die Anzahl der Reifen und der Türen guckt, musst du halt einen Wert aus genau diesen Zahlen berechnen. Dieser sollte sich bei verschiendenen Autos möglichst nicht überlappen, also ist z.B. reifen + türen oder reifen * türen ein schlechter Wert. Üblich ist soetwas:
Code:
public int hashCode() {
int wert = 4711;
wert = 53 * wert + this.getReifen();
wert = 37 * wert + this.getTüren();
//usw. für alle Werte, die in equals() auftauchen
//andere Variablen-Typen etwa so:
//wert = 47 * wert + this.getAutoMarke().hashCode() //String
//wert = 61 * wert + (this.hatTÜV() ? 123 : 456); //boolean
return wert;
}
Dabei dienen die Zahlen 4711, 53, 37 dazu, die Werte besser zu "streuen", auf die genauen zahlen kommt es dabei nicht an (üblich sind Primzahlen). Bei deinem Auto-Problem ist das aber wirklich Kanonen auf Spatzen...
ok danke erstmal für die vielen antworten. hat mir sehr geholfen.
Ich erhalte einen AssignmentOperator ungültig, wenn ich zwei int vergleiche... ich kann mir darauf keienn reim machen, da ich in einem anderen beispiel zwei int ganz normal über == vergleichen konnte