Mic*_*ael 26 java oop overriding equals hashcode
我们假设我上课了User:
public class User {
private Long id;
private String name;
private Integer age;
private BigDecimal account;
// other fields, getters and setters
}
Run Code Online (Sandbox Code Playgroud)
equals如下覆盖方法是否合适?
@Override
public boolean equals(Object ob) {
if (ob == null) {
return false;
}
if (this == ob) {
return true;
}
if (ob instanceof User) {
User other = (User) ob;
return this.id.equals(other.getId());
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
事实证明,对象的唯一性仅由其ID确定.但在我的应用程序中,id总是独一无二的.它在数据库中提供.我的equals实施是否足以说明这一点?或者这不是最佳做法?
当然我理解在这种情况下,hashCode实现应该如下:
@Override
public int hashCode() {
return id.intValue();
}
Run Code Online (Sandbox Code Playgroud)
是否应该这样做取决于你的类的语义.也就是说,你的班级的两个对象是等价的是什么意思?最重要的区别在于具有值语义的对象和具有实体语义的对象之间.实体对象即使具有相同的属性(颜色,长度等)也不相等.在许多情况下,包括从具有主键的数据库表中读取对象时,实体对象将具有唯一的ID字段.在这种情况下仅比较ID字段是正确的事情.
没关系。只要两个不同的用户不能拥有相同的 ID,您的equals功能就足够了。如果一个用户可以用不同的 ID(无论出于何种原因)代表两次,并且您确实希望将它们视为平等,则可能会出现问题。