• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements.  See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License.  You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 package org.apache.commons.lang3.builder;
18 
19 import java.util.Objects;
20 
21 import org.apache.commons.lang3.ObjectUtils;
22 
23 /**
24  * Assists in implementing {@link Object#toString()} methods.
25  *
26  * <p>This class enables a good and consistent {@code toString()} to be built for any
27  * class or object. This class aims to simplify the process by:</p>
28  * <ul>
29  *  <li>allowing field names</li>
30  *  <li>handling all types consistently</li>
31  *  <li>handling nulls consistently</li>
32  *  <li>outputting arrays and multi-dimensional arrays</li>
33  *  <li>enabling the detail level to be controlled for Objects and Collections</li>
34  *  <li>handling class hierarchies</li>
35  * </ul>
36  *
37  * <p>To use this class write code as follows:</p>
38  *
39  * <pre>
40  * public class Person {
41  *   String name;
42  *   int age;
43  *   boolean smoker;
44  *
45  *   ...
46  *
47  *   public String toString() {
48  *     return new ToStringBuilder(this).
49  *       append("name", name).
50  *       append("age", age).
51  *       append("smoker", smoker).
52  *       toString();
53  *   }
54  * }
55  * </pre>
56  *
57  * <p>This will produce a toString of the format:
58  * {@code Person@7f54[name=Stephen,age=29,smoker=false]}</p>
59  *
60  * <p>To add the superclass {@code toString}, use {@link #appendSuper}.
61  * To append the {@code toString} from an object that is delegated
62  * to (or any other object), use {@link #appendToString}.</p>
63  *
64  * <p>Alternatively, there is a method that uses reflection to determine
65  * the fields to test. Because these fields are usually private, the method,
66  * {@code reflectionToString}, uses {@code AccessibleObject.setAccessible} to
67  * change the visibility of the fields. This will fail under a security manager,
68  * unless the appropriate permissions are set up correctly. It is also
69  * slower than testing explicitly.</p>
70  *
71  * <p>A typical invocation for this method would look like:</p>
72  *
73  * <pre>
74  * public String toString() {
75  *   return ToStringBuilder.reflectionToString(this);
76  * }
77  * </pre>
78  *
79  * <p>You can also use the builder to debug 3rd party objects:</p>
80  *
81  * <pre>
82  * System.out.println("An object: " + ToStringBuilder.reflectionToString(anObject));
83  * </pre>
84  *
85  * <p>The exact format of the {@code toString} is determined by
86  * the {@link ToStringStyle} passed into the constructor.</p>
87  *
88  * @since 1.0
89  */
90 public class ToStringBuilder implements Builder<String> {
91 
92     /**
93      * The default style of output to use, not null.
94      */
95     private static volatile ToStringStyle defaultStyle = ToStringStyle.DEFAULT_STYLE;
96 
97     /**
98      * Gets the default {@link ToStringStyle} to use.
99      *
100      * <p>This method gets a singleton default value, typically for the whole JVM.
101      * Changing this default should generally only be done during application startup.
102      * It is recommended to pass a {@link ToStringStyle} to the constructor instead
103      * of using this global default.</p>
104      *
105      * <p>This method can be used from multiple threads.
106      * Internally, a {@code volatile} variable is used to provide the guarantee
107      * that the latest value set using {@link #setDefaultStyle} is the value returned.
108      * It is strongly recommended that the default style is only changed during application startup.</p>
109      *
110      * <p>One reason for changing the default could be to have a verbose style during
111      * development and a compact style in production.</p>
112      *
113      * @return the default {@link ToStringStyle}, never null
114      */
getDefaultStyle()115     public static ToStringStyle getDefaultStyle() {
116         return defaultStyle;
117     }
118 
119     /**
120      * Sets the default {@link ToStringStyle} to use.
121      *
122      * <p>This method sets a singleton default value, typically for the whole JVM.
123      * Changing this default should generally only be done during application startup.
124      * It is recommended to pass a {@link ToStringStyle} to the constructor instead
125      * of changing this global default.</p>
126      *
127      * <p>This method is not intended for use from multiple threads.
128      * Internally, a {@code volatile} variable is used to provide the guarantee
129      * that the latest value set is the value returned from {@link #getDefaultStyle}.</p>
130      *
131      * @param style  the default {@link ToStringStyle}
132      * @throws IllegalArgumentException if the style is {@code null}
133      */
setDefaultStyle(final ToStringStyle style)134     public static void setDefaultStyle(final ToStringStyle style) {
135         defaultStyle = Objects.requireNonNull(style, "style");
136     }
137 
138     /**
139      * Uses {@link ReflectionToStringBuilder} to generate a
140      * {@code toString} for the specified object.
141      *
142      * @param object  the Object to be output
143      * @return the String result
144      * @see ReflectionToStringBuilder#toString(Object)
145      */
reflectionToString(final Object object)146     public static String reflectionToString(final Object object) {
147         return ReflectionToStringBuilder.toString(object);
148     }
149 
150     /**
151      * Uses {@link ReflectionToStringBuilder} to generate a
152      * {@code toString} for the specified object.
153      *
154      * @param object  the Object to be output
155      * @param style  the style of the {@code toString} to create, may be {@code null}
156      * @return the String result
157      * @see ReflectionToStringBuilder#toString(Object,ToStringStyle)
158      */
reflectionToString(final Object object, final ToStringStyle style)159     public static String reflectionToString(final Object object, final ToStringStyle style) {
160         return ReflectionToStringBuilder.toString(object, style);
161     }
162 
163     /**
164      * Uses {@link ReflectionToStringBuilder} to generate a
165      * {@code toString} for the specified object.
166      *
167      * @param object  the Object to be output
168      * @param style  the style of the {@code toString} to create, may be {@code null}
169      * @param outputTransients  whether to include transient fields
170      * @return the String result
171      * @see ReflectionToStringBuilder#toString(Object,ToStringStyle,boolean)
172      */
reflectionToString(final Object object, final ToStringStyle style, final boolean outputTransients)173     public static String reflectionToString(final Object object, final ToStringStyle style, final boolean outputTransients) {
174         return ReflectionToStringBuilder.toString(object, style, outputTransients, false, null);
175     }
176 
177     /**
178      * Uses {@link ReflectionToStringBuilder} to generate a
179      * {@code toString} for the specified object.
180      *
181      * @param <T> the type of the object
182      * @param object  the Object to be output
183      * @param style  the style of the {@code toString} to create, may be {@code null}
184      * @param outputTransients  whether to include transient fields
185      * @param reflectUpToClass  the superclass to reflect up to (inclusive), may be {@code null}
186      * @return the String result
187      * @see ReflectionToStringBuilder#toString(Object,ToStringStyle,boolean,boolean,Class)
188      * @since 2.0
189      */
reflectionToString( final T object, final ToStringStyle style, final boolean outputTransients, final Class<? super T> reflectUpToClass)190     public static <T> String reflectionToString(
191         final T object,
192         final ToStringStyle style,
193         final boolean outputTransients,
194         final Class<? super T> reflectUpToClass) {
195         return ReflectionToStringBuilder.toString(object, style, outputTransients, false, reflectUpToClass);
196     }
197 
198     /**
199      * Current toString buffer, not null.
200      */
201     private final StringBuffer buffer;
202     /**
203      * The object being output, may be null.
204      */
205     private final Object object;
206     /**
207      * The style of output to use, not null.
208      */
209     private final ToStringStyle style;
210 
211     /**
212      * Constructs a builder for the specified object using the default output style.
213      *
214      * <p>This default style is obtained from {@link #getDefaultStyle()}.</p>
215      *
216      * @param object  the Object to build a {@code toString} for, not recommended to be null
217      */
ToStringBuilder(final Object object)218     public ToStringBuilder(final Object object) {
219         this(object, null, null);
220     }
221 
222     /**
223      * Constructs a builder for the specified object using the defined output style.
224      *
225      * <p>If the style is {@code null}, the default style is used.</p>
226      *
227      * @param object  the Object to build a {@code toString} for, not recommended to be null
228      * @param style  the style of the {@code toString} to create, null uses the default style
229      */
ToStringBuilder(final Object object, final ToStringStyle style)230     public ToStringBuilder(final Object object, final ToStringStyle style) {
231         this(object, style, null);
232     }
233 
234     /**
235      * Constructs a builder for the specified object.
236      *
237      * <p>If the style is {@code null}, the default style is used.</p>
238      *
239      * <p>If the buffer is {@code null}, a new one is created.</p>
240      *
241      * @param object  the Object to build a {@code toString} for, not recommended to be null
242      * @param style  the style of the {@code toString} to create, null uses the default style
243      * @param buffer  the {@link StringBuffer} to populate, may be null
244      */
ToStringBuilder(final Object object, ToStringStyle style, StringBuffer buffer)245     public ToStringBuilder(final Object object, ToStringStyle style, StringBuffer buffer) {
246         if (style == null) {
247             style = getDefaultStyle();
248         }
249         if (buffer == null) {
250             buffer = new StringBuffer(512);
251         }
252         this.buffer = buffer;
253         this.style = style;
254         this.object = object;
255 
256         style.appendStart(buffer, object);
257     }
258 
259     /**
260      * Append to the {@code toString} a {@code boolean}
261      * value.
262      *
263      * @param value  the value to add to the {@code toString}
264      * @return this
265      */
append(final boolean value)266     public ToStringBuilder append(final boolean value) {
267         style.append(buffer, null, value);
268         return this;
269     }
270 
271     /**
272      * Append to the {@code toString} a {@code boolean}
273      * array.
274      *
275      * @param array  the array to add to the {@code toString}
276      * @return this
277      */
append(final boolean[] array)278     public ToStringBuilder append(final boolean[] array) {
279         style.append(buffer, null, array, null);
280         return this;
281     }
282 
283     /**
284      * Append to the {@code toString} a {@code byte}
285      * value.
286      *
287      * @param value  the value to add to the {@code toString}
288      * @return this
289      */
append(final byte value)290     public ToStringBuilder append(final byte value) {
291         style.append(buffer, null, value);
292         return this;
293     }
294 
295     /**
296      * Append to the {@code toString} a {@code byte}
297      * array.
298      *
299      * @param array  the array to add to the {@code toString}
300      * @return this
301      */
append(final byte[] array)302     public ToStringBuilder append(final byte[] array) {
303         style.append(buffer, null, array, null);
304         return this;
305     }
306 
307     /**
308      * Append to the {@code toString} a {@code char}
309      * value.
310      *
311      * @param value  the value to add to the {@code toString}
312      * @return this
313      */
append(final char value)314     public ToStringBuilder append(final char value) {
315         style.append(buffer, null, value);
316         return this;
317     }
318 
319     /**
320      * Append to the {@code toString} a {@code char}
321      * array.
322      *
323      * @param array  the array to add to the {@code toString}
324      * @return this
325      */
append(final char[] array)326     public ToStringBuilder append(final char[] array) {
327         style.append(buffer, null, array, null);
328         return this;
329     }
330 
331     /**
332      * Append to the {@code toString} a {@code double}
333      * value.
334      *
335      * @param value  the value to add to the {@code toString}
336      * @return this
337      */
append(final double value)338     public ToStringBuilder append(final double value) {
339         style.append(buffer, null, value);
340         return this;
341     }
342 
343     /**
344      * Append to the {@code toString} a {@code double}
345      * array.
346      *
347      * @param array  the array to add to the {@code toString}
348      * @return this
349      */
append(final double[] array)350     public ToStringBuilder append(final double[] array) {
351         style.append(buffer, null, array, null);
352         return this;
353     }
354 
355     /**
356      * Append to the {@code toString} a {@code float}
357      * value.
358      *
359      * @param value  the value to add to the {@code toString}
360      * @return this
361      */
append(final float value)362     public ToStringBuilder append(final float value) {
363         style.append(buffer, null, value);
364         return this;
365     }
366 
367     /**
368      * Append to the {@code toString} a {@code float}
369      * array.
370      *
371      * @param array  the array to add to the {@code toString}
372      * @return this
373      */
append(final float[] array)374     public ToStringBuilder append(final float[] array) {
375         style.append(buffer, null, array, null);
376         return this;
377     }
378 
379     /**
380      * Append to the {@code toString} an {@code int}
381      * value.
382      *
383      * @param value  the value to add to the {@code toString}
384      * @return this
385      */
append(final int value)386     public ToStringBuilder append(final int value) {
387         style.append(buffer, null, value);
388         return this;
389     }
390 
391     /**
392      * Append to the {@code toString} an {@code int}
393      * array.
394      *
395      * @param array  the array to add to the {@code toString}
396      * @return this
397      */
append(final int[] array)398     public ToStringBuilder append(final int[] array) {
399         style.append(buffer, null, array, null);
400         return this;
401     }
402 
403     /**
404      * Append to the {@code toString} a {@code long}
405      * value.
406      *
407      * @param value  the value to add to the {@code toString}
408      * @return this
409      */
append(final long value)410     public ToStringBuilder append(final long value) {
411         style.append(buffer, null, value);
412         return this;
413     }
414 
415     /**
416      * Append to the {@code toString} a {@code long}
417      * array.
418      *
419      * @param array  the array to add to the {@code toString}
420      * @return this
421      */
append(final long[] array)422     public ToStringBuilder append(final long[] array) {
423         style.append(buffer, null, array, null);
424         return this;
425     }
426 
427     /**
428      * Append to the {@code toString} an {@link Object}
429      * value.
430      *
431      * @param obj  the value to add to the {@code toString}
432      * @return this
433      */
append(final Object obj)434     public ToStringBuilder append(final Object obj) {
435         style.append(buffer, null, obj, null);
436         return this;
437     }
438 
439     /**
440      * Append to the {@code toString} an {@link Object}
441      * array.
442      *
443      * @param array  the array to add to the {@code toString}
444      * @return this
445      */
append(final Object[] array)446     public ToStringBuilder append(final Object[] array) {
447         style.append(buffer, null, array, null);
448         return this;
449     }
450 
451     /**
452      * Append to the {@code toString} a {@code short}
453      * value.
454      *
455      * @param value  the value to add to the {@code toString}
456      * @return this
457      */
append(final short value)458     public ToStringBuilder append(final short value) {
459         style.append(buffer, null, value);
460         return this;
461     }
462 
463     /**
464      * Append to the {@code toString} a {@code short}
465      * array.
466      *
467      * @param array  the array to add to the {@code toString}
468      * @return this
469      */
append(final short[] array)470     public ToStringBuilder append(final short[] array) {
471         style.append(buffer, null, array, null);
472         return this;
473     }
474 
475     /**
476      * Append to the {@code toString} a {@code boolean}
477      * value.
478      *
479      * @param fieldName  the field name
480      * @param value  the value to add to the {@code toString}
481      * @return this
482      */
append(final String fieldName, final boolean value)483     public ToStringBuilder append(final String fieldName, final boolean value) {
484         style.append(buffer, fieldName, value);
485         return this;
486     }
487 
488     /**
489      * Append to the {@code toString} a {@code boolean}
490      * array.
491      *
492      * @param fieldName  the field name
493      * @param array  the array to add to the {@code hashCode}
494      * @return this
495      */
append(final String fieldName, final boolean[] array)496     public ToStringBuilder append(final String fieldName, final boolean[] array) {
497         style.append(buffer, fieldName, array, null);
498         return this;
499     }
500 
501     /**
502      * Append to the {@code toString} a {@code boolean}
503      * array.
504      *
505      * <p>A boolean parameter controls the level of detail to show.
506      * Setting {@code true} will output the array in full. Setting
507      * {@code false} will output a summary, typically the size of
508      * the array.</p>
509      *
510      * @param fieldName  the field name
511      * @param array  the array to add to the {@code toString}
512      * @param fullDetail  {@code true} for detail, {@code false}
513      *  for summary info
514      * @return this
515      */
append(final String fieldName, final boolean[] array, final boolean fullDetail)516     public ToStringBuilder append(final String fieldName, final boolean[] array, final boolean fullDetail) {
517         style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
518         return this;
519     }
520 
521     /**
522      * Append to the {@code toString} an {@code byte}
523      * value.
524      *
525      * @param fieldName  the field name
526      * @param value  the value to add to the {@code toString}
527      * @return this
528      */
append(final String fieldName, final byte value)529     public ToStringBuilder append(final String fieldName, final byte value) {
530         style.append(buffer, fieldName, value);
531         return this;
532     }
533 
534     /**
535      * Append to the {@code toString} a {@code byte} array.
536      *
537      * @param fieldName  the field name
538      * @param array  the array to add to the {@code toString}
539      * @return this
540      */
append(final String fieldName, final byte[] array)541     public ToStringBuilder append(final String fieldName, final byte[] array) {
542         style.append(buffer, fieldName, array, null);
543         return this;
544     }
545 
546     /**
547      * Append to the {@code toString} a {@code byte}
548      * array.
549      *
550      * <p>A boolean parameter controls the level of detail to show.
551      * Setting {@code true} will output the array in full. Setting
552      * {@code false} will output a summary, typically the size of
553      * the array.
554      *
555      * @param fieldName  the field name
556      * @param array  the array to add to the {@code toString}
557      * @param fullDetail  {@code true} for detail, {@code false}
558      *  for summary info
559      * @return this
560      */
append(final String fieldName, final byte[] array, final boolean fullDetail)561     public ToStringBuilder append(final String fieldName, final byte[] array, final boolean fullDetail) {
562         style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
563         return this;
564     }
565 
566     /**
567      * Append to the {@code toString} a {@code char}
568      * value.
569      *
570      * @param fieldName  the field name
571      * @param value  the value to add to the {@code toString}
572      * @return this
573      */
append(final String fieldName, final char value)574     public ToStringBuilder append(final String fieldName, final char value) {
575         style.append(buffer, fieldName, value);
576         return this;
577     }
578 
579     /**
580      * Append to the {@code toString} a {@code char}
581      * array.
582      *
583      * @param fieldName  the field name
584      * @param array  the array to add to the {@code toString}
585      * @return this
586      */
append(final String fieldName, final char[] array)587     public ToStringBuilder append(final String fieldName, final char[] array) {
588         style.append(buffer, fieldName, array, null);
589         return this;
590     }
591 
592     /**
593      * Append to the {@code toString} a {@code char}
594      * array.
595      *
596      * <p>A boolean parameter controls the level of detail to show.
597      * Setting {@code true} will output the array in full. Setting
598      * {@code false} will output a summary, typically the size of
599      * the array.</p>
600      *
601      * @param fieldName  the field name
602      * @param array  the array to add to the {@code toString}
603      * @param fullDetail  {@code true} for detail, {@code false}
604      *  for summary info
605      * @return this
606      */
append(final String fieldName, final char[] array, final boolean fullDetail)607     public ToStringBuilder append(final String fieldName, final char[] array, final boolean fullDetail) {
608         style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
609         return this;
610     }
611 
612     /**
613      * Append to the {@code toString} a {@code double}
614      * value.
615      *
616      * @param fieldName  the field name
617      * @param value  the value to add to the {@code toString}
618      * @return this
619      */
append(final String fieldName, final double value)620     public ToStringBuilder append(final String fieldName, final double value) {
621         style.append(buffer, fieldName, value);
622         return this;
623     }
624 
625     /**
626      * Append to the {@code toString} a {@code double}
627      * array.
628      *
629      * @param fieldName  the field name
630      * @param array  the array to add to the {@code toString}
631      * @return this
632      */
append(final String fieldName, final double[] array)633     public ToStringBuilder append(final String fieldName, final double[] array) {
634         style.append(buffer, fieldName, array, null);
635         return this;
636     }
637 
638     /**
639      * Append to the {@code toString} a {@code double}
640      * array.
641      *
642      * <p>A boolean parameter controls the level of detail to show.
643      * Setting {@code true} will output the array in full. Setting
644      * {@code false} will output a summary, typically the size of
645      * the array.</p>
646      *
647      * @param fieldName  the field name
648      * @param array  the array to add to the {@code toString}
649      * @param fullDetail  {@code true} for detail, {@code false}
650      *  for summary info
651      * @return this
652      */
append(final String fieldName, final double[] array, final boolean fullDetail)653     public ToStringBuilder append(final String fieldName, final double[] array, final boolean fullDetail) {
654         style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
655         return this;
656     }
657 
658     /**
659      * Append to the {@code toString} an {@code float}
660      * value.
661      *
662      * @param fieldName  the field name
663      * @param value  the value to add to the {@code toString}
664      * @return this
665      */
append(final String fieldName, final float value)666     public ToStringBuilder append(final String fieldName, final float value) {
667         style.append(buffer, fieldName, value);
668         return this;
669     }
670 
671     /**
672      * Append to the {@code toString} a {@code float}
673      * array.
674      *
675      * @param fieldName  the field name
676      * @param array  the array to add to the {@code toString}
677      * @return this
678      */
append(final String fieldName, final float[] array)679     public ToStringBuilder append(final String fieldName, final float[] array) {
680         style.append(buffer, fieldName, array, null);
681         return this;
682     }
683 
684     /**
685      * Append to the {@code toString} a {@code float}
686      * array.
687      *
688      * <p>A boolean parameter controls the level of detail to show.
689      * Setting {@code true} will output the array in full. Setting
690      * {@code false} will output a summary, typically the size of
691      * the array.</p>
692      *
693      * @param fieldName  the field name
694      * @param array  the array to add to the {@code toString}
695      * @param fullDetail  {@code true} for detail, {@code false}
696      *  for summary info
697      * @return this
698      */
append(final String fieldName, final float[] array, final boolean fullDetail)699     public ToStringBuilder append(final String fieldName, final float[] array, final boolean fullDetail) {
700         style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
701         return this;
702     }
703 
704     /**
705      * Append to the {@code toString} an {@code int}
706      * value.
707      *
708      * @param fieldName  the field name
709      * @param value  the value to add to the {@code toString}
710      * @return this
711      */
append(final String fieldName, final int value)712     public ToStringBuilder append(final String fieldName, final int value) {
713         style.append(buffer, fieldName, value);
714         return this;
715     }
716 
717     /**
718      * Append to the {@code toString} an {@code int}
719      * array.
720      *
721      * @param fieldName  the field name
722      * @param array  the array to add to the {@code toString}
723      * @return this
724      */
append(final String fieldName, final int[] array)725     public ToStringBuilder append(final String fieldName, final int[] array) {
726         style.append(buffer, fieldName, array, null);
727         return this;
728     }
729 
730     /**
731      * Append to the {@code toString} an {@code int}
732      * array.
733      *
734      * <p>A boolean parameter controls the level of detail to show.
735      * Setting {@code true} will output the array in full. Setting
736      * {@code false} will output a summary, typically the size of
737      * the array.</p>
738      *
739      * @param fieldName  the field name
740      * @param array  the array to add to the {@code toString}
741      * @param fullDetail  {@code true} for detail, {@code false}
742      *  for summary info
743      * @return this
744      */
append(final String fieldName, final int[] array, final boolean fullDetail)745     public ToStringBuilder append(final String fieldName, final int[] array, final boolean fullDetail) {
746         style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
747         return this;
748     }
749 
750     /**
751      * Append to the {@code toString} a {@code long}
752      * value.
753      *
754      * @param fieldName  the field name
755      * @param value  the value to add to the {@code toString}
756      * @return this
757      */
append(final String fieldName, final long value)758     public ToStringBuilder append(final String fieldName, final long value) {
759         style.append(buffer, fieldName, value);
760         return this;
761     }
762 
763     /**
764      * Append to the {@code toString} a {@code long}
765      * array.
766      *
767      * @param fieldName  the field name
768      * @param array  the array to add to the {@code toString}
769      * @return this
770      */
append(final String fieldName, final long[] array)771     public ToStringBuilder append(final String fieldName, final long[] array) {
772         style.append(buffer, fieldName, array, null);
773         return this;
774     }
775 
776     /**
777      * Append to the {@code toString} a {@code long}
778      * array.
779      *
780      * <p>A boolean parameter controls the level of detail to show.
781      * Setting {@code true} will output the array in full. Setting
782      * {@code false} will output a summary, typically the size of
783      * the array.</p>
784      *
785      * @param fieldName  the field name
786      * @param array  the array to add to the {@code toString}
787      * @param fullDetail  {@code true} for detail, {@code false}
788      *  for summary info
789      * @return this
790      */
append(final String fieldName, final long[] array, final boolean fullDetail)791     public ToStringBuilder append(final String fieldName, final long[] array, final boolean fullDetail) {
792         style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
793         return this;
794     }
795 
796     /**
797      * Append to the {@code toString} an {@link Object}
798      * value.
799      *
800      * @param fieldName  the field name
801      * @param obj  the value to add to the {@code toString}
802      * @return this
803      */
append(final String fieldName, final Object obj)804     public ToStringBuilder append(final String fieldName, final Object obj) {
805         style.append(buffer, fieldName, obj, null);
806         return this;
807     }
808 
809     /**
810      * Append to the {@code toString} an {@link Object}
811      * value.
812      *
813      * @param fieldName  the field name
814      * @param obj  the value to add to the {@code toString}
815      * @param fullDetail  {@code true} for detail,
816      *  {@code false} for summary info
817      * @return this
818      */
append(final String fieldName, final Object obj, final boolean fullDetail)819     public ToStringBuilder append(final String fieldName, final Object obj, final boolean fullDetail) {
820         style.append(buffer, fieldName, obj, Boolean.valueOf(fullDetail));
821         return this;
822     }
823 
824     /**
825      * Append to the {@code toString} an {@link Object}
826      * array.
827      *
828      * @param fieldName  the field name
829      * @param array  the array to add to the {@code toString}
830      * @return this
831      */
append(final String fieldName, final Object[] array)832     public ToStringBuilder append(final String fieldName, final Object[] array) {
833         style.append(buffer, fieldName, array, null);
834         return this;
835     }
836 
837     /**
838      * Append to the {@code toString} an {@link Object}
839      * array.
840      *
841      * <p>A boolean parameter controls the level of detail to show.
842      * Setting {@code true} will output the array in full. Setting
843      * {@code false} will output a summary, typically the size of
844      * the array.</p>
845      *
846      * @param fieldName  the field name
847      * @param array  the array to add to the {@code toString}
848      * @param fullDetail  {@code true} for detail, {@code false}
849      *  for summary info
850      * @return this
851      */
append(final String fieldName, final Object[] array, final boolean fullDetail)852     public ToStringBuilder append(final String fieldName, final Object[] array, final boolean fullDetail) {
853         style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
854         return this;
855     }
856 
857     /**
858      * Append to the {@code toString} an {@code short}
859      * value.
860      *
861      * @param fieldName  the field name
862      * @param value  the value to add to the {@code toString}
863      * @return this
864      */
append(final String fieldName, final short value)865     public ToStringBuilder append(final String fieldName, final short value) {
866         style.append(buffer, fieldName, value);
867         return this;
868     }
869 
870     /**
871      * Append to the {@code toString} a {@code short}
872      * array.
873      *
874      * @param fieldName  the field name
875      * @param array  the array to add to the {@code toString}
876      * @return this
877      */
append(final String fieldName, final short[] array)878     public ToStringBuilder append(final String fieldName, final short[] array) {
879         style.append(buffer, fieldName, array, null);
880         return this;
881     }
882 
883     /**
884      * Append to the {@code toString} a {@code short}
885      * array.
886      *
887      * <p>A boolean parameter controls the level of detail to show.
888      * Setting {@code true} will output the array in full. Setting
889      * {@code false} will output a summary, typically the size of
890      * the array.
891      *
892      * @param fieldName  the field name
893      * @param array  the array to add to the {@code toString}
894      * @param fullDetail  {@code true} for detail, {@code false}
895      *  for summary info
896      * @return this
897      */
append(final String fieldName, final short[] array, final boolean fullDetail)898     public ToStringBuilder append(final String fieldName, final short[] array, final boolean fullDetail) {
899         style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
900         return this;
901     }
902 
903     /**
904      * Appends with the same format as the default <code>Object toString()
905      * </code> method. Appends the class name followed by
906      * {@link System#identityHashCode(Object)}.
907      *
908      * @param srcObject  the {@link Object} whose class name and id to output
909      * @return this
910      * @throws NullPointerException if {@code srcObject} is {@code null}
911      * @since 2.0
912      */
appendAsObjectToString(final Object srcObject)913     public ToStringBuilder appendAsObjectToString(final Object srcObject) {
914         ObjectUtils.identityToString(this.getStringBuffer(), srcObject);
915         return this;
916     }
917 
918     /**
919      * Append the {@code toString} from the superclass.
920      *
921      * <p>This method assumes that the superclass uses the same {@link ToStringStyle}
922      * as this one.</p>
923      *
924      * <p>If {@code superToString} is {@code null}, no change is made.</p>
925      *
926      * @param superToString  the result of {@code super.toString()}
927      * @return this
928      * @since 2.0
929      */
appendSuper(final String superToString)930     public ToStringBuilder appendSuper(final String superToString) {
931         if (superToString != null) {
932             style.appendSuper(buffer, superToString);
933         }
934         return this;
935     }
936 
937     /**
938      * Append the {@code toString} from another object.
939      *
940      * <p>This method is useful where a class delegates most of the implementation of
941      * its properties to another class. You can then call {@code toString()} on
942      * the other class and pass the result into this method.</p>
943      *
944      * <pre>
945      *   private AnotherObject delegate;
946      *   private String fieldInThisClass;
947      *
948      *   public String toString() {
949      *     return new ToStringBuilder(this).
950      *       appendToString(delegate.toString()).
951      *       append(fieldInThisClass).
952      *       toString();
953      *   }</pre>
954      *
955      * <p>This method assumes that the other object uses the same {@link ToStringStyle}
956      * as this one.</p>
957      *
958      * <p>If the {@code toString} is {@code null}, no change is made.</p>
959      *
960      * @param toString  the result of {@code toString()} on another object
961      * @return this
962      * @since 2.0
963      */
appendToString(final String toString)964     public ToStringBuilder appendToString(final String toString) {
965         if (toString != null) {
966             style.appendToString(buffer, toString);
967         }
968         return this;
969     }
970 
971     /**
972      * Returns the {@link Object} being output.
973      *
974      * @return The object being output.
975      * @since 2.0
976      */
getObject()977     public Object getObject() {
978         return object;
979     }
980 
981     /**
982      * Gets the {@link StringBuffer} being populated.
983      *
984      * @return the {@link StringBuffer} being populated
985      */
getStringBuffer()986     public StringBuffer getStringBuffer() {
987         return buffer;
988     }
989 
990     /**
991      * Gets the {@link ToStringStyle} being used.
992      *
993      * @return the {@link ToStringStyle} being used
994      * @since 2.0
995      */
getStyle()996     public ToStringStyle getStyle() {
997         return style;
998     }
999 
1000     /**
1001      * Returns the built {@code toString}.
1002      *
1003      * <p>This method appends the end of data indicator, and can only be called once.
1004      * Use {@link #getStringBuffer} to get the current string state.</p>
1005      *
1006      * <p>If the object is {@code null}, return the style's {@code nullText}</p>
1007      *
1008      * @return the String {@code toString}
1009      */
1010     @Override
toString()1011     public String toString() {
1012         if (this.getObject() == null) {
1013             this.getStringBuffer().append(this.getStyle().getNullText());
1014         } else {
1015             style.appendEnd(this.getStringBuffer(), this.getObject());
1016         }
1017         return this.getStringBuffer().toString();
1018     }
1019 
1020     /**
1021      * Returns the String that was build as an object representation. The
1022      * default implementation utilizes the {@link #toString()} implementation.
1023      *
1024      * @return the String {@code toString}
1025      *
1026      * @see #toString()
1027      *
1028      * @since 3.0
1029      */
1030     @Override
build()1031     public String build() {
1032         return toString();
1033     }
1034 }
1035