Grails:比较两个未保存的域类对象始终返回false

时间:2015-01-16 18:17:08

标签: grails groovy comparison equals grails-domain-class

我需要比较几个域类对象,但它们仍未保存,但是,我总是从比较中得到错误的结果。事实证明,即使以下比较也会返回false:

new DomainClass().equals(new DomainClass())

由于两者都是全新的对象,因此它们应该具有相同的数据并且应该彼此相等。不幸的是,equals方法(或==运算符)返回false。还有另一种正确的方法来进行这种比较吗?

2 个答案:

答案 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