我有一个名为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。我应该更改我的平等合约以检查所有字段的相等性吗?你有什么建议?
3 回答
神不在的星期二
TA贡献1963条经验 获得超6个赞
你在做什么似乎罚款,而你没有违反任何规则是equals必须遵守。
您可能仍然想要检查其他字段,而不是更改equals的语义,而是检测业务逻辑中的不一致之处,并可能触发断言/异常。
繁星点点滴滴
TA贡献1803条经验 获得超3个赞
这是一个棘手的决定。
这是我几个月前考虑进行哈希处理时遇到的一个问题。我建议您阅读一下什么是哈希,因为它与您的答案高度相关...我建议您正在寻求实现某种哈希并测试其相等性。
等同性有不同的种类...对象的身份等同,对象的数据等同,整个对象的等同...您也可以在其中包括审核信息。
事实是,“相等”具有许多可能的含义。
我通过在所有领域中将严格实现为平等来解决此问题,只是因为在询问之后,它似乎是平等的直观含义。然后,我为所需的其他种类的相等性构造了方法,并定义了一个包装这些方法的接口。
我不会在对象==上测试相等性,因为经常会用相同的数据测试两个不同的对象,尽管我的书指的是不同的内存地址,但在我的书中它们是相等的。
添加回答
举报
0/150
提交
取消