jakub holý

building the right thing, building it right, fast

Groovy: Use @Canonical to Get Compiler-generated Equals, HashCode and ToString

2011-11-02General

Groovy makes it extremely easy to create Java beans with getters, setters, equals, hashCode, and toString:


@groovy.transform.Canonical
class Call {
   def method
   def args

/* // custom impl. reusing the auto-generated one: String toString() { _toString().replaceFirst("^.*?Call", "") }*/ }


You can then do:


// Auto-gen. constr. with positional arguments:
def call1 = new Call("someMethod", "someArgs")
def call2 = new Call(method: "someMethod", args: "someArgs")
assert call1.getMethod() == call1.method
assert call2.equals(call1)
assert ([call1, call2] as Set).size() == 1 // hashCode


As you might have noticed, you may provide your own implementation of toString and reuse the auto-generated toString by calling _toString().

References

JavaDoc for @Canonical. You can also use separately any of: @ToString. @EqualsAndHashCode, @TupleConstructor. And may be check also the other available AST annotations such as Immutable and Synchronized and perhaps also groovy.beans's Bindable and Vetoable annotations, if you need true Java Beans.