【发布时间】:2015-06-09 16:24:47
【问题描述】:
我有一个对象Foo,它从Object 继承了默认的equals 方法,我不想重写它,因为引用相等是我想使用的身份关系。
我现在有一个特定的情况,我现在想根据特定的字段比较这些对象。我想写一个比较器,FooValueComparator,来执行这个比较。但是,如果我的FooValueComparator 在两个对象对该特定字段具有相同值时返回 0,则它与从 Object 继承的 equals 方法不兼容,以及随之而来的所有问题。
我想做的是让FooValueComparator 先比较两个对象的字段值,然后再比较它们的引用。这可能吗?这可能会带来哪些陷阱(例如,内存位置的更改导致Foo 对象的相对顺序发生更改)?
我希望我的比较器与 equals 兼容的原因是因为我希望可以选择将其应用于 SortedSet 对象的 SortedSet 集合。我不希望 SortedSet 拒绝我尝试添加的 Foo,因为它已经包含具有相同值的不同对象。
【问题讨论】:
-
如果两个 Foo 是同一个对象(例如,它们具有相同的引用),那么它们不能具有不同的字段值,对吧?因为它们是同一个对象?或者你说的是成员变量的引用?
-
很难或不可能“比较”参考位置。
-
@DavidKoelle 你当然是正确的。如果
foo1 == foo2,这意味着它们的字段值将相等,因此比任何基于字段值的等价关系更具区分性。我的问题是它更严格地歧视。因此,可能有Foos 具有匹配值但不是同一个对象。 -
@LouisWasserman 嗯,这就是我害怕的。
标签: java equals comparator