我需要比较几个域类对象,但它们仍未保存,但是,我总是从比较中得到错误的结果。事实证明,即使以下比较也会返回false:
new DomainClass().equals(new DomainClass())
由于两者都是全新的对象,因此它们应该具有相同的数据并且应该彼此相等。不幸的是,equals方法(或==运算符)返回false。还有另一种正确的方法来进行这种比较吗?
答案 0 :(得分:3)
您的代码与此相同:
a = new DomainClass();
b = new DomainClass();
a.equals(b)
很明显,只要 a 且 b 没有引用相同的对象,测试就必须返回false。
如果你想要基于价值的比较:
迭代字段并逐个比较
或点击此处查看more formal way of doing it。
答案 1 :(得分:2)
您可以使用“spaceship operator”(< =>),其工作方式与compareTo()相同
或者您可以覆盖DomainClass中的equals()方法,以便能够使用此代码
new DomainClass().equals(new DomainClass())
要覆盖equals(),您可以使用@EqualsAndHashCode
注释
此注释自动生成equals()和hashcode()方法
所以,你的课将如下所示:
@EqualsAndHashCode
class DomainClass(){
String field1
String filed2
etc
}
并且您生成的equals方法将如下所示:
public boolean equals(java.lang.Object other)
if (other == null) return false
if (this.is(other)) return true
if (!(other instanceof DomainClass)) return false
if (!other.canEqual(this)) return false
if (field1 != other.field1) return false
if (field2 != other.field2) return false
// etc
return true
}
有关详细信息,请查看此http://groovy.codehaus.org/api/groovy/transform/EqualsAndHashCode.html