如何实现可比性,使其与身份平等保持一致

2022-09-02 19:47:52

我有一个类,其相等性(如)必须由对象标识定义,即.equals()this == other

我想实现对此类对象进行排序(例如通过某些属性)。为了与 一致,即使两个对象具有相同的名称,也不得返回 。ComparablegetName()equals()compareTo()0

有没有办法在某种意义上比较对象标识?我可以比较,但是在哈希冲突的情况下仍然会返回。compareToSystem.identityHashCode(o)0


答案 1

我认为这里真正的答案是:不要实现可比性。实现此接口意味着您的对象具有自然顺序。当你跟进这个想法时,“平等”的东西应该在同一个地方。

如果有的话,您应该使用自定义比较器...但即使这样也没有多大意义。如果定义<b的东西...不允许给你 a == b(当 a 和 b 根据你的<关系“相等”时),那么对于你的用例来说,整个比较方法就被打破了。

换句话说:仅仅因为你可以把代码放到一个“以某种方式”产生你想要的东西的类中......这样做并不是一个好主意


答案 2

根据定义,通过为每个对象分配一个通用唯一标识符 (UUID)(或全局唯一标识符 (GUID))作为其标识属性,UUID 具有可比性,并且与 equals 一致。Java已经有一个UUID类,一旦生成,您就可以使用字符串表示来实现持久性。专用属性还将确保标识在版本/线程/计算机之间是稳定的。如果您有一种确保所有内容都获得唯一ID的方法,您也可以只使用递增的ID,但是使用标准的UUID实现将保护您免受集合合并和并行系统同时生成数据的问题。

如果您使用其他任何东西作为可比性,这意味着它以与其身份/值分开的方式具有可比性。因此,您需要定义此对象的可比含义,并记录下来。例如,人们按姓名,出生日期,身高或按优先顺序的组合具有可比性;最自然地通过名称作为约定(以便于人类查找),这与两个人是同一个人是分开的。你还必须接受比较和相等是脱节的,因为它们基于不同的东西。


推荐