Friday, March 01, 2013

Template toString(), hasCode() and equals() in Eclipse

I am using the following template in Eclipse to output a standard pattern for toString(), hashCode() and equals(). By default I use Apache commons lang.

   @Override
   public String toString() {
      return new org.apache.commons.lang.builder.ToStringBuilder${cursor}(this).append("some field", someField)
            .append("some field", someField).toString();
   }

   @Override
   public int hashCode() {
      return new org.apache.commons.lang.builder.HashCodeBuilder()
            .append(someField).append(someField).toHashCode();
   }

   @Override
   public boolean equals(final Object obj) {
      if (obj == this) {
         return true;  // test for reference equality
      }
      if (obj == null) {
         return false; // test for null
      }
      if (obj instanceof ${enclosing_type}) {
         final ${enclosing_type} other =
               (${enclosing_type}) obj;
         return org.apache.commons.lang.ObjectUtils.equals(someField, other.someField)
               && ObjectUtils.equals(someField, other.someField);
      } else {
         return false;
      }
   }

In Eclipse, I enter this through Window > Preferences > Java > Editor > Templates > click New, and enter details as below.

Template I use in Eclipse for toString(), hashCode() and equals() - click to expand

Note that I include the fully qualified name of the utility classes (such as org.apache.commons.lang.builder.HashCodeBuilder) just once so that I can easily import them through Eclipse by clicking on the fully qualified name and pressing control+shift+m.

As mentioned above, I am using Apache commons lang by default. However as explained by Sean Patrick Floyd in this StackOverflow post, guava-libraries are also a good choice. Java 7's Objects class has an equals(Object a, Object b) utility method that will serve for part of this too.

Although toString(), hashCode() and equals() may seem simple enough, there are many pitfalls to be aware of when implementing these methods. I recommend reading Effective Java (2nd Edition) by Joshua Bloch to learn more (available as an Amazon Kindle eBook).