philipjkim philipjkim - 2 months ago 7
Java Question

Using Google Guava's Objects.ToStringHelper

I used

ToStringBuilder.reflectionToString(class)
in commons-lang, to implement
toString()
for simple DTOs. Now I'm trying to use Google Guava instead of Apache commons library. And I found
Objects.ToStringHelper
in Guava. But it's too verbose if there're lots of members in the class. For example:

@Override
public String toString() {
return MoreObjects.toStringHelper(this.getClass()).add("name", name)
.add("emailAddress", emailAddress)
.add("department", department).add("yearJoined", yearJoined)
.toString();
}


is much simpler if I use commons-lang:

@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}


Is there any better ways to implement
toString()
with Guava, not with commons-lang?

Guava docs

Answer

I have a little trick for Guava's com.google.common.base.MoreObjects.toStringHelper(). I configured IntelliJ IDEA to use it when auto-generating toString() methods. I assume you can do the same in Eclipse. Here's how to do it in Intellij:

  • go inside a class
  • hit Alt + Insert to popup the "Generate" menu
  • choose toString()
  • click the "Settings" button
  • go to the "Templates" tab
  • create a new template named "Guava's MoreObjects.toStringHelper()" (I did it by copying the "ToStringBuilder" template)
  • change the template to:

    public String toString() {
    #set ($autoImportPackages = "com.google.common.base.MoreObjects")
        return MoreObjects.toStringHelper(this)
    #foreach ($member in $members)
        .add("$member.name", $member.accessor)
    #end
        .toString();
    }
    
  • save the template, close the "Settings" and "Generate toString()" windows

  • you can now choose the Guava's MoreObjects.toStringHelper() template when generating toString() methods

When you add a new field to the class, simply re-generate the toString() method (IDEA will ask you to confirm that you want to replace the existing toString() method).