Ich bin relativ neu in Java und versuche nur, meinen Kopf zu verstehen @Override
der equals()
und hashcode()
Methoden.
ich für die Methode equals kennen zu stimmen es sein muss:Welchen Teil des equals() Generalvertrags erfüllt mein equals() nicht
- Reflexive:
a.equals(a)
- Symmetrisch:
a.equals(b)
dannb.equals(a)
- Transitive:
a.equals(b) && b.equals(c)
Danna.equals(c)
- Nicht null:
! a.equals(null)
Ich kämpfe, welche der oben genannten Eigenschaften ich bin und bin nicht befriedigend zu lokalisieren, wenn meine overide des Verfahrens equals zu schreiben.
Ich bin mir bewusst, dass Eclipse diese für mich generieren kann, aber da ich das Konzept noch nicht vollständig verstanden habe, hilft es mir, es zu lernen.
Ich habe geschrieben, was ich denke, ist der richtige Weg, es zu tun, aber wenn ich mit der Eclipse-generierten Version überprüfe ich scheinen einige Aspekte "fehlen".
Beispiel:
public class People {
private Name first; //Invariants --> !Null, !=last
private Name last; // !Null, !=first
private int age; // !Null, ! <=0
...
}
Was ich schrieb:
public boolean equals(Object obj){
if (obj == null){
return false;
}
if (!(obj instanceof People)){
return false;
}
People other = (People) obj;
if (this.age != other.age){
return false;
}
if (! this.first.equals(other.first)){
return false;
}
if (! this.last.equals(other.last)){
return false;
}
return true;
}
vs eclipse
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
People other = (People) obj;
if (first == null) {
if (other.first != null)
return false;
} else if (!first.equals(other.first))
return false;
if (age != other.age)
return false;
if (last == null) {
if (other.last != null)
return false;
} else if (!last.equals(other.last))
return false;
return true;
}
generiert mir fehlt:
if (this == obj) return true;
if (getClass() != obj.getClass()) return false;
Und für jede Variable:
if (first == null) { if (other.first != null) return false; } else if (!first.equals(other.first)) return false;
Ich bin mir nicht sicher, was getClass()
und ist mein implmentation nicht richtig?
Warum werfen Sie bei der Implementierung von equals für 'People' auf' Name'? Sieht aus wie ein Tippfehler. Bitte klären Sie. – Radiodef
Sie könnten auch sehen [* "Irgendeinen Grund zu bevorzugen, getClass() über instanceof beim Generieren .equals()?" *] (Http://stackoverflow.com/q/596462/2891664) Eine ganze Antwort kann nur geschrieben werden dieses Thema allein. – Radiodef
Sie haben immer noch wenn (!(obj instanceof Name)) {Zeile falsch –