What is the nicest toString builder class you have used or seen ? What made it nice

mP. picture mP. · Jan 21, 2011 · Viewed 8.9k times · Source

Lets face it writing nice toString messages is a boring messy chore that needs to be done as it can really be helpful for insepection in a debugger or logging.

What features do you like or wish should be in such a helper...

  • dumping properties should come w/ labels.

    name=mP country=Australia ...

  • values that are some default should optionally be skipped.

    • Theres no point printing lots of properties that are 0 or null.
    • If you set a label and the value is null dont include either.
  • the seperator between label and value should be updatable and it should auto be inserted between labels and values when they are added.

  • it should also auto insert the separator of your choice.

    If you want commas spaces whatever between values when including an array so be it.

  • it should auto quote string values...because its important to know exactly where a string starts and ends.

    *name=mP state="New South Wales"

  • when a list, map or set is added the rules about quoting strings, using the set separator etc should be respected. Please dont just dump Collection.toString().

I have a few others in someting i am improving can you list your own ideas, observations etc.

  new ToStringBuilder()
    .setLabelValueSeparator('=')
    .label("name")
    .value(Country.AUSTRALIA) // -> returns "Australia" without the quotes.
    .label("day of death")
    .value(null) //
    .label("numbers")
    .valueSeparator(",");
    .value(Arrays.asList( 1, 2, 3 )
    .build();

will of course result in "name="Australia" numbers=1, 2, 3;

Answer

ripper234 picture ripper234 · Nov 20, 2011

Apache ToStringBuilder has a decent implenentation out of the box:

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

I'm actually looking right now on how to get its output to be a bit prettier. ReflectionStringBuilder seems to offer some more customization. Specifically I like this:

@Override
public String toString() {
    StandardToStringStyle style = new StandardToStringStyle();
    style.setFieldSeparator(", ");
    style.setUseClassName(false);
    style.setUseIdentityHashCode(false);

    return new ReflectionToStringBuilder(this, style).toString();
}

The output looks like this:

[[email protected], age=16, createdDate=<null>, favoriteColor=blue, id=2]