猿问

实施平等合同的正确方法

我有一个名为User的域对象。用户的属性包括ssoId,名称,电子邮件,createdBy,createdDate和userRole。其中,ssoId必须是唯一的,因为两个用户不能具有相同的sso id。因此,我的equals方法检查sso id并返回true或false。


@Override public boolean equals(Object o) {

    if (!(o instanceof User))

      return false;

    return user.getSsoId().equals((User)o.getSsoId());

}

我认为这是一个错误的实现,尽管就业务规则而言是正确的。对于具有相同sso id但名称或电子邮件或两者具有不同值的两个对象,以上实现将返回true。我应该更改我的平等合约以检查所有字段的相等性吗?你有什么建议?


aluckdog
浏览 441回答 3
3回答

神不在的星期二

你在做什么似乎罚款,而你没有违反任何规则是equals必须遵守。您可能仍然想要检查其他字段,而不是更改equals的语义,而是检测业务逻辑中的不一致之处,并可能触发断言/异常。

繁星点点滴滴

这是一个棘手的决定。这是我几个月前考虑进行哈希处理时遇到的一个问题。我建议您阅读一下什么是哈希,因为它与您的答案高度相关...我建议您正在寻求实现某种哈希并测试其相等性。等同性有不同的种类...对象的身份等同,对象的数据等同,整个对象的等同...您也可以在其中包括审核信息。事实是,“相等”具有许多可能的含义。我通过在所有领域中将严格实现为平等来解决此问题,只是因为在询问之后,它似乎是平等的直观含义。然后,我为所需的其他种类的相等性构造了方法,并定义了一个包装这些方法的接口。我不会在对象==上测试相等性,因为经常会用相同的数据测试两个不同的对象,尽管我的书指的是不同的内存地址,但在我的书中它们是相等的。
随时随地看视频慕课网APP

相关分类

Java
我要回答