Groovy:生成equals和hashCode方法

Dón*_*nal 4 java groovy

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

class Address {

  Integer streetNumber
  String streetName
  String state
  String zip
  Country country    
}
Run Code Online (Sandbox Code Playgroud)

虽然我可以编写(或使用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);
}
Run Code Online (Sandbox Code Playgroud)

虽然这样可以正常工作,但我觉得我可以更好地利用Groovy的动力来在更少的代码中实现相同的功能.一种让人想到的方法是使用.properties获取对象的属性名称和值的映射.然后,我可以迭代这些属性,调用hashCode()equals()在每个属性上实现与上面相同的结果.

在我走这条路之前,我只想检查是否有其他人找到了解决这个问题的好方法.我对推出自己的解决方案有点警惕,因为搞乱的后果equals()hashCode()潜在的可怕性很难追查.

谢谢,唐

Roe*_*ker 11

我不是一个常规的开发人员,但我理解从groovy 1.8你可以使用类型上的@EqualsAndHashCode来调用AST转换.

  • 并注意它只考虑_properties_(不是具有公共/受保护/私有访问修饰符的字段),除非您在注释上指定*includeFields = true* (2认同)

Cem*_*kas 5

或者,你可以使用的Apache Commons Lang中EqualsBuilderHashCodeBuilder.您可以让制造商使用反射,使得其将评估所有字段或确定哪些领域应该包括在equals()hashCode()计算.

ToStringBuilder如果你有兴趣,他们也有.