equals() 只依赖于一个 ID 合适吗?

2022-09-01 07:02:24

假设我有类:User

public class User {
  private Long id;
  private String name;
  private Integer age;
  private BigDecimal account;
  // other fields, getters and setters
}

按如下方式重写该方法是否正确?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;
}

事实证明,对象的唯一性仅由其 ID 决定。但在我的应用程序中,始终是唯一的。它在数据库中提供。我的实现是否足以说明这一点?或者这不是最佳做法吗?idequals

当然,我理解在这种情况下,实现应该是这样的:hashCode

@Override
public int hashCode() {
   return id.intValue();
}

答案 1

是否应该这样做取决于类的语义。也就是说,说类中的两个对象是等效的是什么意思

最重要的区别是具有值语义的对象和具有实体语义的对象。实体对象不是等效的,即使它们具有等效的属性(颜色、长度等)。在许多情况下,包括从具有主键的数据库表中读取对象时,实体对象将具有唯一的 ID 字段。在这种情况下,仅比较 ID 字段是正确的做法。


答案 2

将 id 用于方法是可以的,只要您不必将尚未持久化的实体与 DB 进行比较即可。如果要比较尚未保存的实体,则必须比较其属性。equals