如果我有一个简单的Groovy类,例如

class Address {

  Integer streetNumber
  String streetName
  String state
  String zip
  Country country
}

尽管我可以编写(或使用IDE生成)hashCodeequals方法,例如:
boolean equals(o) {
    if (this.is(o)) return true;

    if (!o || getClass() != o.class) return false;

    Address that = (Address) o;

    if (streetNumber? !streetNumber.equals(that.streetNumber) : that.streetNumber!= null) return false;
    if (streetName? !streetName.equals(that.streetName) : that.streetName!= null) return false;
    if (state? !state.equals(that.state) : that.state!= null) return false;
    if (zip? !zip.equals(that.zip) : that.zip!= null) return false;
    if (country? !zip.equals(that.zip) : that.zip!= null) return false;

    return true;
}

int hashCode() {
    int result = (streetNumber ? streetNumber.hashCode() : 0);
    result = 31 * result + (streetName ? streetName.hashCode() : 0);
    result = 31 * result + (state ? state.hashCode() : 0);
    result = 31 * result + (zip ? zip.hashCode() : 0);
    return 31 * result + (country ? country.hashCode() : 0);
}

尽管这可以很好地工作,但我认为我可以更好地利用Groovy的动态性以更少的代码来实现相同的目的。一种想到的方法是使用.properties获取对象的属性名称和值的映射。然后,我可以遍历这些属性,在每个属性上调用hashCode()equals()以实现与上述相同的结果。

在走这条路之前,我只想检查是否有人找到了解决此问题的好方法。我对推出自己的解决方案有些警惕,因为弄乱equals()hashCode()的后果可能很可怕,很难追踪。

谢谢,
大学教师

最佳答案

我不是groovy开发人员,但我了解从groovy 1.8开始,您可以在类型上使用@EqualsAndHashCode调用AST转换。

09-10 10:15
查看更多