aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/apache/commons/lang3/builder/ToStringBuilder.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/apache/commons/lang3/builder/ToStringBuilder.java')
-rw-r--r--src/main/java/org/apache/commons/lang3/builder/ToStringBuilder.java1034
1 files changed, 1034 insertions, 0 deletions
diff --git a/src/main/java/org/apache/commons/lang3/builder/ToStringBuilder.java b/src/main/java/org/apache/commons/lang3/builder/ToStringBuilder.java
new file mode 100644
index 000000000..231d3fc7a
--- /dev/null
+++ b/src/main/java/org/apache/commons/lang3/builder/ToStringBuilder.java
@@ -0,0 +1,1034 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.lang3.builder;
+
+import java.util.Objects;
+
+import org.apache.commons.lang3.ObjectUtils;
+
+/**
+ * Assists in implementing {@link Object#toString()} methods.
+ *
+ * <p>This class enables a good and consistent {@code toString()} to be built for any
+ * class or object. This class aims to simplify the process by:</p>
+ * <ul>
+ * <li>allowing field names</li>
+ * <li>handling all types consistently</li>
+ * <li>handling nulls consistently</li>
+ * <li>outputting arrays and multi-dimensional arrays</li>
+ * <li>enabling the detail level to be controlled for Objects and Collections</li>
+ * <li>handling class hierarchies</li>
+ * </ul>
+ *
+ * <p>To use this class write code as follows:</p>
+ *
+ * <pre>
+ * public class Person {
+ * String name;
+ * int age;
+ * boolean smoker;
+ *
+ * ...
+ *
+ * public String toString() {
+ * return new ToStringBuilder(this).
+ * append("name", name).
+ * append("age", age).
+ * append("smoker", smoker).
+ * toString();
+ * }
+ * }
+ * </pre>
+ *
+ * <p>This will produce a toString of the format:
+ * {@code Person@7f54[name=Stephen,age=29,smoker=false]}</p>
+ *
+ * <p>To add the superclass {@code toString}, use {@link #appendSuper}.
+ * To append the {@code toString} from an object that is delegated
+ * to (or any other object), use {@link #appendToString}.</p>
+ *
+ * <p>Alternatively, there is a method that uses reflection to determine
+ * the fields to test. Because these fields are usually private, the method,
+ * {@code reflectionToString}, uses {@code AccessibleObject.setAccessible} to
+ * change the visibility of the fields. This will fail under a security manager,
+ * unless the appropriate permissions are set up correctly. It is also
+ * slower than testing explicitly.</p>
+ *
+ * <p>A typical invocation for this method would look like:</p>
+ *
+ * <pre>
+ * public String toString() {
+ * return ToStringBuilder.reflectionToString(this);
+ * }
+ * </pre>
+ *
+ * <p>You can also use the builder to debug 3rd party objects:</p>
+ *
+ * <pre>
+ * System.out.println("An object: " + ToStringBuilder.reflectionToString(anObject));
+ * </pre>
+ *
+ * <p>The exact format of the {@code toString} is determined by
+ * the {@link ToStringStyle} passed into the constructor.</p>
+ *
+ * @since 1.0
+ */
+public class ToStringBuilder implements Builder<String> {
+
+ /**
+ * The default style of output to use, not null.
+ */
+ private static volatile ToStringStyle defaultStyle = ToStringStyle.DEFAULT_STYLE;
+
+ /**
+ * Gets the default {@link ToStringStyle} to use.
+ *
+ * <p>This method gets a singleton default value, typically for the whole JVM.
+ * Changing this default should generally only be done during application startup.
+ * It is recommended to pass a {@link ToStringStyle} to the constructor instead
+ * of using this global default.</p>
+ *
+ * <p>This method can be used from multiple threads.
+ * Internally, a {@code volatile} variable is used to provide the guarantee
+ * that the latest value set using {@link #setDefaultStyle} is the value returned.
+ * It is strongly recommended that the default style is only changed during application startup.</p>
+ *
+ * <p>One reason for changing the default could be to have a verbose style during
+ * development and a compact style in production.</p>
+ *
+ * @return the default {@link ToStringStyle}, never null
+ */
+ public static ToStringStyle getDefaultStyle() {
+ return defaultStyle;
+ }
+
+ /**
+ * Sets the default {@link ToStringStyle} to use.
+ *
+ * <p>This method sets a singleton default value, typically for the whole JVM.
+ * Changing this default should generally only be done during application startup.
+ * It is recommended to pass a {@link ToStringStyle} to the constructor instead
+ * of changing this global default.</p>
+ *
+ * <p>This method is not intended for use from multiple threads.
+ * Internally, a {@code volatile} variable is used to provide the guarantee
+ * that the latest value set is the value returned from {@link #getDefaultStyle}.</p>
+ *
+ * @param style the default {@link ToStringStyle}
+ * @throws IllegalArgumentException if the style is {@code null}
+ */
+ public static void setDefaultStyle(final ToStringStyle style) {
+ defaultStyle = Objects.requireNonNull(style, "style");
+ }
+
+ /**
+ * Uses {@link ReflectionToStringBuilder} to generate a
+ * {@code toString} for the specified object.
+ *
+ * @param object the Object to be output
+ * @return the String result
+ * @see ReflectionToStringBuilder#toString(Object)
+ */
+ public static String reflectionToString(final Object object) {
+ return ReflectionToStringBuilder.toString(object);
+ }
+
+ /**
+ * Uses {@link ReflectionToStringBuilder} to generate a
+ * {@code toString} for the specified object.
+ *
+ * @param object the Object to be output
+ * @param style the style of the {@code toString} to create, may be {@code null}
+ * @return the String result
+ * @see ReflectionToStringBuilder#toString(Object,ToStringStyle)
+ */
+ public static String reflectionToString(final Object object, final ToStringStyle style) {
+ return ReflectionToStringBuilder.toString(object, style);
+ }
+
+ /**
+ * Uses {@link ReflectionToStringBuilder} to generate a
+ * {@code toString} for the specified object.
+ *
+ * @param object the Object to be output
+ * @param style the style of the {@code toString} to create, may be {@code null}
+ * @param outputTransients whether to include transient fields
+ * @return the String result
+ * @see ReflectionToStringBuilder#toString(Object,ToStringStyle,boolean)
+ */
+ public static String reflectionToString(final Object object, final ToStringStyle style, final boolean outputTransients) {
+ return ReflectionToStringBuilder.toString(object, style, outputTransients, false, null);
+ }
+
+ /**
+ * Uses {@link ReflectionToStringBuilder} to generate a
+ * {@code toString} for the specified object.
+ *
+ * @param <T> the type of the object
+ * @param object the Object to be output
+ * @param style the style of the {@code toString} to create, may be {@code null}
+ * @param outputTransients whether to include transient fields
+ * @param reflectUpToClass the superclass to reflect up to (inclusive), may be {@code null}
+ * @return the String result
+ * @see ReflectionToStringBuilder#toString(Object,ToStringStyle,boolean,boolean,Class)
+ * @since 2.0
+ */
+ public static <T> String reflectionToString(
+ final T object,
+ final ToStringStyle style,
+ final boolean outputTransients,
+ final Class<? super T> reflectUpToClass) {
+ return ReflectionToStringBuilder.toString(object, style, outputTransients, false, reflectUpToClass);
+ }
+
+ /**
+ * Current toString buffer, not null.
+ */
+ private final StringBuffer buffer;
+ /**
+ * The object being output, may be null.
+ */
+ private final Object object;
+ /**
+ * The style of output to use, not null.
+ */
+ private final ToStringStyle style;
+
+ /**
+ * Constructs a builder for the specified object using the default output style.
+ *
+ * <p>This default style is obtained from {@link #getDefaultStyle()}.</p>
+ *
+ * @param object the Object to build a {@code toString} for, not recommended to be null
+ */
+ public ToStringBuilder(final Object object) {
+ this(object, null, null);
+ }
+
+ /**
+ * Constructs a builder for the specified object using the defined output style.
+ *
+ * <p>If the style is {@code null}, the default style is used.</p>
+ *
+ * @param object the Object to build a {@code toString} for, not recommended to be null
+ * @param style the style of the {@code toString} to create, null uses the default style
+ */
+ public ToStringBuilder(final Object object, final ToStringStyle style) {
+ this(object, style, null);
+ }
+
+ /**
+ * Constructs a builder for the specified object.
+ *
+ * <p>If the style is {@code null}, the default style is used.</p>
+ *
+ * <p>If the buffer is {@code null}, a new one is created.</p>
+ *
+ * @param object the Object to build a {@code toString} for, not recommended to be null
+ * @param style the style of the {@code toString} to create, null uses the default style
+ * @param buffer the {@link StringBuffer} to populate, may be null
+ */
+ public ToStringBuilder(final Object object, ToStringStyle style, StringBuffer buffer) {
+ if (style == null) {
+ style = getDefaultStyle();
+ }
+ if (buffer == null) {
+ buffer = new StringBuffer(512);
+ }
+ this.buffer = buffer;
+ this.style = style;
+ this.object = object;
+
+ style.appendStart(buffer, object);
+ }
+
+ /**
+ * Append to the {@code toString} a {@code boolean}
+ * value.
+ *
+ * @param value the value to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final boolean value) {
+ style.append(buffer, null, value);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code boolean}
+ * array.
+ *
+ * @param array the array to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final boolean[] array) {
+ style.append(buffer, null, array, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code byte}
+ * value.
+ *
+ * @param value the value to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final byte value) {
+ style.append(buffer, null, value);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code byte}
+ * array.
+ *
+ * @param array the array to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final byte[] array) {
+ style.append(buffer, null, array, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code char}
+ * value.
+ *
+ * @param value the value to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final char value) {
+ style.append(buffer, null, value);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code char}
+ * array.
+ *
+ * @param array the array to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final char[] array) {
+ style.append(buffer, null, array, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code double}
+ * value.
+ *
+ * @param value the value to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final double value) {
+ style.append(buffer, null, value);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code double}
+ * array.
+ *
+ * @param array the array to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final double[] array) {
+ style.append(buffer, null, array, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code float}
+ * value.
+ *
+ * @param value the value to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final float value) {
+ style.append(buffer, null, value);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code float}
+ * array.
+ *
+ * @param array the array to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final float[] array) {
+ style.append(buffer, null, array, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} an {@code int}
+ * value.
+ *
+ * @param value the value to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final int value) {
+ style.append(buffer, null, value);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} an {@code int}
+ * array.
+ *
+ * @param array the array to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final int[] array) {
+ style.append(buffer, null, array, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code long}
+ * value.
+ *
+ * @param value the value to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final long value) {
+ style.append(buffer, null, value);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code long}
+ * array.
+ *
+ * @param array the array to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final long[] array) {
+ style.append(buffer, null, array, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} an {@link Object}
+ * value.
+ *
+ * @param obj the value to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final Object obj) {
+ style.append(buffer, null, obj, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} an {@link Object}
+ * array.
+ *
+ * @param array the array to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final Object[] array) {
+ style.append(buffer, null, array, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code short}
+ * value.
+ *
+ * @param value the value to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final short value) {
+ style.append(buffer, null, value);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code short}
+ * array.
+ *
+ * @param array the array to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final short[] array) {
+ style.append(buffer, null, array, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code boolean}
+ * value.
+ *
+ * @param fieldName the field name
+ * @param value the value to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final boolean value) {
+ style.append(buffer, fieldName, value);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code boolean}
+ * array.
+ *
+ * @param fieldName the field name
+ * @param array the array to add to the {@code hashCode}
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final boolean[] array) {
+ style.append(buffer, fieldName, array, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code boolean}
+ * array.
+ *
+ * <p>A boolean parameter controls the level of detail to show.
+ * Setting {@code true} will output the array in full. Setting
+ * {@code false} will output a summary, typically the size of
+ * the array.</p>
+ *
+ * @param fieldName the field name
+ * @param array the array to add to the {@code toString}
+ * @param fullDetail {@code true} for detail, {@code false}
+ * for summary info
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final boolean[] array, final boolean fullDetail) {
+ style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} an {@code byte}
+ * value.
+ *
+ * @param fieldName the field name
+ * @param value the value to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final byte value) {
+ style.append(buffer, fieldName, value);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code byte} array.
+ *
+ * @param fieldName the field name
+ * @param array the array to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final byte[] array) {
+ style.append(buffer, fieldName, array, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code byte}
+ * array.
+ *
+ * <p>A boolean parameter controls the level of detail to show.
+ * Setting {@code true} will output the array in full. Setting
+ * {@code false} will output a summary, typically the size of
+ * the array.
+ *
+ * @param fieldName the field name
+ * @param array the array to add to the {@code toString}
+ * @param fullDetail {@code true} for detail, {@code false}
+ * for summary info
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final byte[] array, final boolean fullDetail) {
+ style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code char}
+ * value.
+ *
+ * @param fieldName the field name
+ * @param value the value to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final char value) {
+ style.append(buffer, fieldName, value);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code char}
+ * array.
+ *
+ * @param fieldName the field name
+ * @param array the array to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final char[] array) {
+ style.append(buffer, fieldName, array, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code char}
+ * array.
+ *
+ * <p>A boolean parameter controls the level of detail to show.
+ * Setting {@code true} will output the array in full. Setting
+ * {@code false} will output a summary, typically the size of
+ * the array.</p>
+ *
+ * @param fieldName the field name
+ * @param array the array to add to the {@code toString}
+ * @param fullDetail {@code true} for detail, {@code false}
+ * for summary info
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final char[] array, final boolean fullDetail) {
+ style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code double}
+ * value.
+ *
+ * @param fieldName the field name
+ * @param value the value to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final double value) {
+ style.append(buffer, fieldName, value);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code double}
+ * array.
+ *
+ * @param fieldName the field name
+ * @param array the array to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final double[] array) {
+ style.append(buffer, fieldName, array, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code double}
+ * array.
+ *
+ * <p>A boolean parameter controls the level of detail to show.
+ * Setting {@code true} will output the array in full. Setting
+ * {@code false} will output a summary, typically the size of
+ * the array.</p>
+ *
+ * @param fieldName the field name
+ * @param array the array to add to the {@code toString}
+ * @param fullDetail {@code true} for detail, {@code false}
+ * for summary info
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final double[] array, final boolean fullDetail) {
+ style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} an {@code float}
+ * value.
+ *
+ * @param fieldName the field name
+ * @param value the value to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final float value) {
+ style.append(buffer, fieldName, value);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code float}
+ * array.
+ *
+ * @param fieldName the field name
+ * @param array the array to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final float[] array) {
+ style.append(buffer, fieldName, array, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code float}
+ * array.
+ *
+ * <p>A boolean parameter controls the level of detail to show.
+ * Setting {@code true} will output the array in full. Setting
+ * {@code false} will output a summary, typically the size of
+ * the array.</p>
+ *
+ * @param fieldName the field name
+ * @param array the array to add to the {@code toString}
+ * @param fullDetail {@code true} for detail, {@code false}
+ * for summary info
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final float[] array, final boolean fullDetail) {
+ style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} an {@code int}
+ * value.
+ *
+ * @param fieldName the field name
+ * @param value the value to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final int value) {
+ style.append(buffer, fieldName, value);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} an {@code int}
+ * array.
+ *
+ * @param fieldName the field name
+ * @param array the array to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final int[] array) {
+ style.append(buffer, fieldName, array, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} an {@code int}
+ * array.
+ *
+ * <p>A boolean parameter controls the level of detail to show.
+ * Setting {@code true} will output the array in full. Setting
+ * {@code false} will output a summary, typically the size of
+ * the array.</p>
+ *
+ * @param fieldName the field name
+ * @param array the array to add to the {@code toString}
+ * @param fullDetail {@code true} for detail, {@code false}
+ * for summary info
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final int[] array, final boolean fullDetail) {
+ style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code long}
+ * value.
+ *
+ * @param fieldName the field name
+ * @param value the value to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final long value) {
+ style.append(buffer, fieldName, value);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code long}
+ * array.
+ *
+ * @param fieldName the field name
+ * @param array the array to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final long[] array) {
+ style.append(buffer, fieldName, array, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code long}
+ * array.
+ *
+ * <p>A boolean parameter controls the level of detail to show.
+ * Setting {@code true} will output the array in full. Setting
+ * {@code false} will output a summary, typically the size of
+ * the array.</p>
+ *
+ * @param fieldName the field name
+ * @param array the array to add to the {@code toString}
+ * @param fullDetail {@code true} for detail, {@code false}
+ * for summary info
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final long[] array, final boolean fullDetail) {
+ style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} an {@link Object}
+ * value.
+ *
+ * @param fieldName the field name
+ * @param obj the value to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final Object obj) {
+ style.append(buffer, fieldName, obj, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} an {@link Object}
+ * value.
+ *
+ * @param fieldName the field name
+ * @param obj the value to add to the {@code toString}
+ * @param fullDetail {@code true} for detail,
+ * {@code false} for summary info
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final Object obj, final boolean fullDetail) {
+ style.append(buffer, fieldName, obj, Boolean.valueOf(fullDetail));
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} an {@link Object}
+ * array.
+ *
+ * @param fieldName the field name
+ * @param array the array to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final Object[] array) {
+ style.append(buffer, fieldName, array, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} an {@link Object}
+ * array.
+ *
+ * <p>A boolean parameter controls the level of detail to show.
+ * Setting {@code true} will output the array in full. Setting
+ * {@code false} will output a summary, typically the size of
+ * the array.</p>
+ *
+ * @param fieldName the field name
+ * @param array the array to add to the {@code toString}
+ * @param fullDetail {@code true} for detail, {@code false}
+ * for summary info
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final Object[] array, final boolean fullDetail) {
+ style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} an {@code short}
+ * value.
+ *
+ * @param fieldName the field name
+ * @param value the value to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final short value) {
+ style.append(buffer, fieldName, value);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code short}
+ * array.
+ *
+ * @param fieldName the field name
+ * @param array the array to add to the {@code toString}
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final short[] array) {
+ style.append(buffer, fieldName, array, null);
+ return this;
+ }
+
+ /**
+ * Append to the {@code toString} a {@code short}
+ * array.
+ *
+ * <p>A boolean parameter controls the level of detail to show.
+ * Setting {@code true} will output the array in full. Setting
+ * {@code false} will output a summary, typically the size of
+ * the array.
+ *
+ * @param fieldName the field name
+ * @param array the array to add to the {@code toString}
+ * @param fullDetail {@code true} for detail, {@code false}
+ * for summary info
+ * @return this
+ */
+ public ToStringBuilder append(final String fieldName, final short[] array, final boolean fullDetail) {
+ style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
+ return this;
+ }
+
+ /**
+ * Appends with the same format as the default <code>Object toString()
+ * </code> method. Appends the class name followed by
+ * {@link System#identityHashCode(Object)}.
+ *
+ * @param srcObject the {@link Object} whose class name and id to output
+ * @return this
+ * @throws NullPointerException if {@code srcObject} is {@code null}
+ * @since 2.0
+ */
+ public ToStringBuilder appendAsObjectToString(final Object srcObject) {
+ ObjectUtils.identityToString(this.getStringBuffer(), srcObject);
+ return this;
+ }
+
+ /**
+ * Append the {@code toString} from the superclass.
+ *
+ * <p>This method assumes that the superclass uses the same {@link ToStringStyle}
+ * as this one.</p>
+ *
+ * <p>If {@code superToString} is {@code null}, no change is made.</p>
+ *
+ * @param superToString the result of {@code super.toString()}
+ * @return this
+ * @since 2.0
+ */
+ public ToStringBuilder appendSuper(final String superToString) {
+ if (superToString != null) {
+ style.appendSuper(buffer, superToString);
+ }
+ return this;
+ }
+
+ /**
+ * Append the {@code toString} from another object.
+ *
+ * <p>This method is useful where a class delegates most of the implementation of
+ * its properties to another class. You can then call {@code toString()} on
+ * the other class and pass the result into this method.</p>
+ *
+ * <pre>
+ * private AnotherObject delegate;
+ * private String fieldInThisClass;
+ *
+ * public String toString() {
+ * return new ToStringBuilder(this).
+ * appendToString(delegate.toString()).
+ * append(fieldInThisClass).
+ * toString();
+ * }</pre>
+ *
+ * <p>This method assumes that the other object uses the same {@link ToStringStyle}
+ * as this one.</p>
+ *
+ * <p>If the {@code toString} is {@code null}, no change is made.</p>
+ *
+ * @param toString the result of {@code toString()} on another object
+ * @return this
+ * @since 2.0
+ */
+ public ToStringBuilder appendToString(final String toString) {
+ if (toString != null) {
+ style.appendToString(buffer, toString);
+ }
+ return this;
+ }
+
+ /**
+ * Returns the {@link Object} being output.
+ *
+ * @return The object being output.
+ * @since 2.0
+ */
+ public Object getObject() {
+ return object;
+ }
+
+ /**
+ * Gets the {@link StringBuffer} being populated.
+ *
+ * @return the {@link StringBuffer} being populated
+ */
+ public StringBuffer getStringBuffer() {
+ return buffer;
+ }
+
+ /**
+ * Gets the {@link ToStringStyle} being used.
+ *
+ * @return the {@link ToStringStyle} being used
+ * @since 2.0
+ */
+ public ToStringStyle getStyle() {
+ return style;
+ }
+
+ /**
+ * Returns the built {@code toString}.
+ *
+ * <p>This method appends the end of data indicator, and can only be called once.
+ * Use {@link #getStringBuffer} to get the current string state.</p>
+ *
+ * <p>If the object is {@code null}, return the style's {@code nullText}</p>
+ *
+ * @return the String {@code toString}
+ */
+ @Override
+ public String toString() {
+ if (this.getObject() == null) {
+ this.getStringBuffer().append(this.getStyle().getNullText());
+ } else {
+ style.appendEnd(this.getStringBuffer(), this.getObject());
+ }
+ return this.getStringBuffer().toString();
+ }
+
+ /**
+ * Returns the String that was build as an object representation. The
+ * default implementation utilizes the {@link #toString()} implementation.
+ *
+ * @return the String {@code toString}
+ *
+ * @see #toString()
+ *
+ * @since 3.0
+ */
+ @Override
+ public String build() {
+ return toString();
+ }
+}