Я новичок в java и просто пытаюсь понять идею @Override
методов equals()
и hashcode()
.
Я знаю, что метод equals должен быть правильным:
- Рефлексивный:
a.equals(a)
- Симметричный:
a.equals(b)
, затемb.equals(a)
- Transitive:
a.equals(b) && b.equals(c)
Затемa.equals(c)
- Не null:
! a.equals(null)
Я изо всех сил пытаюсь определить, какое из указанных выше свойств я есть, и не удовлетворительно, когда пишу свое переопределение метода equals.
Я знаю, что затмение может генерировать их для меня, однако, поскольку я еще не получил это понятие полностью, его выписывание помогает мне учиться.
Я выписал то, что я думаю, это правильный способ сделать это, но когда я проверяю сгенерированную версию eclipse, я, кажется, "не хватает" некоторых аспектов.
Пример:
public class People {
private Name first; //Invariants --> !Null, !=last
private Name last; // !Null, !=first
private int age; // !Null, ! <=0
...
}
Что я написал:
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 генерируемое затмение
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;
}
Мне не хватает:
-
if (this == obj) return true;
-
if (getClass() != obj.getClass()) return false;
-
И для каждой переменной:
if (first == null) { if (other.first != null) return false; } else if (!first.equals(other.first)) return false;
Я не уверен, что getClass()
является и неверно ли я имплантирован?