这(几乎)对“技术平等”是正确的,但对“自然平等”却不正确。为了达到最高的技术平等,你还应该测试自反性
o == this。该对象可能尚未持久存储在数据库中,因此还没有技术ID。例如
public class User { private Long id; @Override public boolean equals(Object object) { return (object instanceof User) && (id != null) ? id.equals(((User) object).id) : (object == this); } @Override public int hashCode() { return (id != null) ? (User.class.hashCode() + id.hashCode()) : super.hashCode(); }}
对于“自然平等”,你应该比较所有非技术属性。对于“现实世界的实体”而言,这毕竟比技术平等更强大(但也更昂贵)。
public class User { private String name; private Date birth; private int housenumber; private long phonenumber; @Override public boolean equals(Object object) { // Basic checks. if (object == this) return true; if (!(object instanceof User)) return false; // Property checks. User other = (User) object; return Objects.equals(name, other.name) && Objects.equals(birth, other.birth) && (housenumber == other.housenumber) && (phonenumber == other.phonenumber); } @Override public int hashCode() { return Objects.hash(name, birth, housenumber, phonenumber); }}
没错,当有很多属性时,这就是很多代码。有点像样的IDE(Eclipse中,NetBeans中,等),可以只自动生成
equals(),
hashCode()(也
toString(),getter和setter)为你服务。充分利用它。在Eclipse中,右键单击代码,然后偷看Source(Alt + Shift + S)菜单选项。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)