나는 간단한 그루비 클래스가있는 경우 등 내가 쓰기 (또는 생성하는 IDE를 사용) hashCode
및 equals
방법처럼 수 있지만그루비 : 등호와 hashCode 메소드를 생성
class Address {
Integer streetNumber
String streetName
String state
String zip
Country country
}
등 :
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 1.8-beta-1에서만 사용할 수 있습니다. Groovy 1.8은 2010 년 말에 출시 될 예정입니다. 자세한 내용은 http://groovy.codehaus.org/News –
을 참조하십시오. 공개/보호/개인 액세스 수정자가있는 필드가 아닌 _properties_ 만 고려합니다. 어노테이션에 * includeFields = true *를 지정하십시오. –