equals()仅依赖于ID是否合适?

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)

Rae*_*ald 8

是否应该这样做取决于你的类的语义.也就是说,你的班级的两个对象是等价的是什么意思?最重要的区别在于具有值语义的对象和具有实体语义的对象之间.实体对象即使具有相同的属性(颜色,长度等)也不相等.在许多情况下,包括从具有主键的数据库表中读取对象时,实体对象将具有唯一的ID字段.在这种情况下仅比较ID字段是正确的事情.


Kni*_*nug 1

没关系。只要两个不同的用户不能拥有相同的 ID,您的equals功能就足够了。如果一个用户可以用不同的 ID(无论出于何种原因)代表两次,并且您确实希望将它们视为平等,则可能会出现问题。