Code style determines how the generated method works and what classes it uses. There are several code styles available to chose from the combo box in generator's dialog:
return "FooClass [aFloat=" + aFloat + ", aString=" + aString + ", anInt=" + anInt + ", anObject=" + anObject + "]";With "Skip null values" option turned on, the code becomes a little harder to read:
return "FooClass [aFloat=" + aFloat + ", " + (aString != null ? "aString=" + aString + ", " : "") + "anInt=" + anInt + ", " + (anObject != null ? "anObject=" + anObject : "") + "]";
StringBuilder builder = new StringBuilder(); builder.append("FooClass [aFloat="); builder.append(aFloat); builder.append(", aString="); builder.append(aString); builder.append(", anInt="); builder.append(anInt); builder.append(", anObject="); builder.append(anObject); builder.append("]"); return builder.toString();The "Skip null values" option doesn't obfuscate the code as much as previously:
StringBuilder builder = new StringBuilder(); builder.append("FooClass [aFloat="); builder.append(aFloat); builder.append(", "); if (aString != null) { builder.append("aString="); builder.append(aString); builder.append(", "); } builder.append("anInt="); builder.append(anInt); builder.append(", "); if (anObject != null) { builder.append("anObject="); builder.append(anObject); } builder.append("]"); return builder.toString();
StringBuilder builder = new StringBuilder(); builder.append("FooClass [aFloat=").append(aFloat).append(", aString=").append(aString) .append(", anInt=").append(anInt).append(", anObject=").append(anObject).append("]"); return builder.toString();With "Skip null values" switched on, the chain must be broken:
StringBuilder builder = new StringBuilder(); builder.append("FooClass [aFloat=").append(aFloat).append(", "); if (aString != null) { builder.append("aString=").append(aString).append(", "); } builder.append("anInt=").append(anInt).append(", "); if (anObject != null) { builder.append("anObject=").append(anObject); } builder.append("]"); return builder.toString();
return String.format("FooClass [aFloat=%s, aString=%s, anInt=%s, anObject=%s]", aFloat, aString, anInt, anObject);Because there's no
String.format()
in JDK 1.4 and ealier, MessageFormat.format()
is used instead:
return MessageFormat.format("FooClass [aFloat={1}, aString={2}, anInt={3}, anObject={4}]", new Object[] { Float.valueOf(aFloat), aString, Integer.valueOf(anInt), anObject });
org.apache.commons.lang.builder.ToStringBuilder
. It ignores the format template because ToStringBuilder already takes care the output string's format. Maybe it's a little less flexible, but the power of this solution is that you can easily change the style of all toStrings within the project without changing any actual object's toString method.Collection
or Map
. That's why it is not recommended to use "ignore arrays' default toString()" or "Limit number of items in arrays/collections/maps" options with this style.
ToStringBuilder builder = new ToStringBuilder(this); builder.append("aFloat", aFloat); builder.append("aString", aString); builder.append("anInt", anInt); builder.append("anObject", anObject); return builder.toString();Skipping nulls works this way:
ToStringBuilder builder = new ToStringBuilder(this); builder.append("aFloat", aFloat); if (aString != null) builder.append("aString", aString); builder.append("anInt", anInt); if (anObject != null) builder.append("anObject", anObject); return builder.toString();
ToStringBuilder builder = new ToStringBuilder(this); builder.append("aFloat", aFloat).append("aString", aString) .append("anInt", anInt).append("anObject", anObject); return builder.toString();"Skip null values" option breakes the chain in similar way to chained StringBuilder style.
org.springframework.core.style.ToStringCreator
to create output string. There's a chained-calls version as well.
Generate toString() dialog
toString() generator: format templates
toString() generator: listing content