如果我有一个简单的Groovy类,例如:
虽然这种方法可以正常工作,但我觉得我可以更好地利用Groovy的动态性,在更少的代码中实现相同的功能。其中一种方法是使用
在我采取这种方法之前,我想先检查是否有其他人已经找到了解决这个问题的好方法。我有点担心自己编写的解决方案,因为搞砸
谢谢, Don
class Address {
Integer streetNumber
String streetName
String state
String zip
Country country
}
虽然我可以编写(或使用IDE生成)hashCode
和equals
方法,例如:
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()
的后果可能是严重的,并且很难追踪。谢谢, Don