Если у меня есть простой класс Groovy, такой как
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()
потенциально ужасны и их трудно отследить.
Спасибо,
Дон