While it's been around for a while (version 1.0 was released in 2002), I recently discovered Apache Commons Lang and its various Builders that help make writing equals(), hashCode, and toString() much simpler.
To quote the project's homepage:
The standard Java libraries fail to provide enough methods for manipulation of its core classes. The Lang Component provides these extra methods.
Here's a simple object with two properties that demonstrates how to use some of the Builders:
import org.apache.commons.lang.builder.EqualsBuilder;An example use of the overriden methods in Groovy:
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
public class Person {
String name;
Integer age;
Person(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object object) {
return EqualsBuilder.reflectionEquals(this, object);
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
def person = new Person("Costanza", 35)Produces:
println "String: $person"
println "Hash Code: " + person.hashCode()
def samePerson = new Person("Costanza", 35)
def differentPerson = new Person("Newman", 35)
println "Same equals(): " + person.equals(samePerson)
println "Different equals(): " + person.equals(differentPerson)
String: Person@6bb36[name=Costanza,age=35]An alternative to ToStringBuilder is ReflectionToStringBuilder:
Hash Code: -422159695
Same equals(): true
Different equals(): false
import org.apache.commons.lang.builder.ReflectionToStringBuilder;
...
public String toString() {
return ReflectionToStringBuilder.toString(this);
}
For String building, there are also various styles you can pass to the builder's constructor: String Styles.
There's also a CompareToBuilder that I have yet to play with.