Java – 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:

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

is much simpler if I use commons-lang:

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

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

Guava docs

Best Solution

I have a little trick for Guava's 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 = "")
        return MoreObjects.toStringHelper(this)
    #foreach ($member in $members)
        .add("$", $member.accessor)
  • 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).