All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.hasor.utils.builder.ToStringBuilder Maven / Gradle / Ivy

There is a newer version: 4.2.5
Show newest version
/*
 * 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 net.hasor.utils.builder;
import net.hasor.utils.BooleanUtils;
import net.hasor.utils.ObjectUtils;
/**
 * 

Assists in implementing {@link Object#toString()} methods.

* *

This class enables a good and consistent toString() to be built for any * class or object. This class aims to simplify the process by:

*
    *
  • allowing field names
  • *
  • handling all types consistently
  • *
  • handling nulls consistently
  • *
  • outputting arrays and multi-dimensional arrays
  • *
  • enabling the detail level to be controlled for Objects and Collections
  • *
  • handling class hierarchies
  • *
* *

To use this class write code as follows:

* *
 * 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();
 *   }
 * }
 * 
* *

This will produce a toString of the format: * Person@7f54[name=Stephen,age=29,smoker=false]

* *

To add the superclass toString, use {@link #appendSuper}. * To append the toString from an object that is delegated * to (or any other object), use {@link #appendToString}.

* *

Alternatively, there is a method that uses reflection to determine * the fields to test. Because these fields are usually private, the method, * reflectionToString, uses 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.

* *

A typical invocation for this method would look like:

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

You can also use the builder to debug 3rd party objects:

* *
 * System.out.println("An object: " + ToStringBuilder.reflectionToString(anObject));
 * 
* *

The exact format of the toString is determined by * the {@link ToStringStyle} passed into the constructor.

* * @author Apache Software Foundation * @author Gary Gregory * @author Pete Gieser * @since 1.0 * @version $Id: ToStringBuilder.java 905636 2010-02-02 14:03:32Z niallp $ */ public class ToStringBuilder { /** * The default style of output to use, not null. */ private static volatile ToStringStyle defaultStyle = ToStringStyle.DEFAULT_STYLE; //---------------------------------------------------------------------------- /** *

Gets the default ToStringStyle to use.

* *

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 ToStringStyle to the constructor instead * of using this global default.

* *

This method can be used from multiple threads. * Internally, a 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.

* *

One reason for changing the default could be to have a verbose style during * development and a compact style in production.

* * @return the default ToStringStyle, never null */ public static ToStringStyle getDefaultStyle() { return defaultStyle; } /** *

Sets the default ToStringStyle to use.

* *

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 ToStringStyle to the constructor instead * of changing this global default.

* *

This method is not intended for use from multiple threads. * Internally, a volatile variable is used to provide the guarantee * that the latest value set is the value returned from {@link #getDefaultStyle}.

* * @param style the default ToStringStyle * @throws IllegalArgumentException if the style is null */ public static void setDefaultStyle(ToStringStyle style) { if (style == null) { throw new IllegalArgumentException("The style must not be null"); } defaultStyle = style; } //---------------------------------------------------------------------------- /** *

Uses ReflectionToStringBuilder to generate a * toString for the specified object.

* * @param object the Object to be output * @return the String result * @see ReflectionToStringBuilder#toString(Object) */ public static String reflectionToString(Object object) { return ReflectionToStringBuilder.toString(object); } /** *

Uses ReflectionToStringBuilder to generate a * toString for the specified object.

* * @param object the Object to be output * @param style the style of the toString to create, may be null * @return the String result * @see ReflectionToStringBuilder#toString(Object, ToStringStyle) */ public static String reflectionToString(Object object, ToStringStyle style) { return ReflectionToStringBuilder.toString(object, style); } /** *

Uses ReflectionToStringBuilder to generate a * toString for the specified object.

* * @param object the Object to be output * @param style the style of the toString to create, may be null * @param outputTransients whether to include transient fields * @return the String result * @see ReflectionToStringBuilder#toString(Object, ToStringStyle, boolean) */ public static String reflectionToString(Object object, ToStringStyle style, boolean outputTransients) { return ReflectionToStringBuilder.toString(object, style, outputTransients, false, null); } /** *

Uses ReflectionToStringBuilder to generate a * toString for the specified object.

* * @param object the Object to be output * @param style the style of the toString to create, may be null * @param outputTransients whether to include transient fields * @param reflectUpToClass the superclass to reflect up to (inclusive), may be null * @return the String result * @see ReflectionToStringBuilder#toString(Object, ToStringStyle, boolean, boolean, Class) * @since 2.0 */ public static String reflectionToString(Object object, ToStringStyle style, boolean outputTransients, Class 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.

* *

This default style is obtained from {@link #getDefaultStyle()}.

* * @param object the Object to build a toString for, not recommended to be null */ public ToStringBuilder(Object object) { this(object, null, null); } /** *

Constructs a builder for the specified object using the a defined output style.

* *

If the style is null, the default style is used.

* * @param object the Object to build a toString for, not recommended to be null * @param style the style of the toString to create, null uses the default style */ public ToStringBuilder(Object object, ToStringStyle style) { this(object, style, null); } /** *

Constructs a builder for the specified object.

* *

If the style is null, the default style is used.

* *

If the buffer is null, a new one is created.

* * @param object the Object to build a toString for, not recommended to be null * @param style the style of the toString to create, null uses the default style * @param buffer the StringBuffer to populate, may be null */ public ToStringBuilder(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 toString a boolean * value.

* * @param value the value to add to the toString * @return this */ public ToStringBuilder append(boolean value) { style.append(buffer, null, value); return this; } //---------------------------------------------------------------------------- /** *

Append to the toString a boolean * array.

* * @param array the array to add to the toString * @return this */ public ToStringBuilder append(boolean[] array) { style.append(buffer, null, array, null); return this; } //---------------------------------------------------------------------------- /** *

Append to the toString a byte * value.

* * @param value the value to add to the toString * @return this */ public ToStringBuilder append(byte value) { style.append(buffer, null, value); return this; } //---------------------------------------------------------------------------- /** *

Append to the toString a byte * array.

* * @param array the array to add to the toString * @return this */ public ToStringBuilder append(byte[] array) { style.append(buffer, null, array, null); return this; } //---------------------------------------------------------------------------- /** *

Append to the toString a char * value.

* * @param value the value to add to the toString * @return this */ public ToStringBuilder append(char value) { style.append(buffer, null, value); return this; } //---------------------------------------------------------------------------- /** *

Append to the toString a char * array.

* * @param array the array to add to the toString * @return this */ public ToStringBuilder append(char[] array) { style.append(buffer, null, array, null); return this; } //---------------------------------------------------------------------------- /** *

Append to the toString a double * value.

* * @param value the value to add to the toString * @return this */ public ToStringBuilder append(double value) { style.append(buffer, null, value); return this; } //---------------------------------------------------------------------------- /** *

Append to the toString a double * array.

* * @param array the array to add to the toString * @return this */ public ToStringBuilder append(double[] array) { style.append(buffer, null, array, null); return this; } //---------------------------------------------------------------------------- /** *

Append to the toString a float * value.

* * @param value the value to add to the toString * @return this */ public ToStringBuilder append(float value) { style.append(buffer, null, value); return this; } //---------------------------------------------------------------------------- /** *

Append to the toString a float * array.

* * @param array the array to add to the toString * @return this */ public ToStringBuilder append(float[] array) { style.append(buffer, null, array, null); return this; } //---------------------------------------------------------------------------- /** *

Append to the toString an int * value.

* * @param value the value to add to the toString * @return this */ public ToStringBuilder append(int value) { style.append(buffer, null, value); return this; } //---------------------------------------------------------------------------- /** *

Append to the toString an int * array.

* * @param array the array to add to the toString * @return this */ public ToStringBuilder append(int[] array) { style.append(buffer, null, array, null); return this; } //---------------------------------------------------------------------------- /** *

Append to the toString a long * value.

* * @param value the value to add to the toString * @return this */ public ToStringBuilder append(long value) { style.append(buffer, null, value); return this; } //---------------------------------------------------------------------------- /** *

Append to the toString a long * array.

* * @param array the array to add to the toString * @return this */ public ToStringBuilder append(long[] array) { style.append(buffer, null, array, null); return this; } //---------------------------------------------------------------------------- /** *

Append to the toString an Object * value.

* * @param obj the value to add to the toString * @return this */ public ToStringBuilder append(Object obj) { style.append(buffer, null, obj, null); return this; } //---------------------------------------------------------------------------- /** *

Append to the toString an Object * array.

* * @param array the array to add to the toString * @return this */ public ToStringBuilder append(Object[] array) { style.append(buffer, null, array, null); return this; } //---------------------------------------------------------------------------- /** *

Append to the toString a short * value.

* * @param value the value to add to the toString * @return this */ public ToStringBuilder append(short value) { style.append(buffer, null, value); return this; } //---------------------------------------------------------------------------- /** *

Append to the toString a short * array.

* * @param array the array to add to the toString * @return this */ public ToStringBuilder append(short[] array) { style.append(buffer, null, array, null); return this; } /** *

Append to the toString a boolean * value.

* * @param fieldName the field name * @param value the value to add to the toString * @return this */ public ToStringBuilder append(String fieldName, boolean value) { style.append(buffer, fieldName, value); return this; } /** *

Append to the toString a boolean * array.

* * @param fieldName the field name * @param array the array to add to the hashCode * @return this */ public ToStringBuilder append(String fieldName, boolean[] array) { style.append(buffer, fieldName, array, null); return this; } /** *

Append to the toString a boolean * array.

* *

A boolean parameter controls the level of detail to show. * Setting true will output the array in full. Setting * false will output a summary, typically the size of * the array.

* * @param fieldName the field name * @param array the array to add to the toString * @param fullDetail true for detail, false * for summary info * @return this */ public ToStringBuilder append(String fieldName, boolean[] array, boolean fullDetail) { style.append(buffer, fieldName, array, BooleanUtils.toBooleanObject(fullDetail)); return this; } /** *

Append to the toString an byte * value.

* * @param fieldName the field name * @param value the value to add to the toString * @return this */ public ToStringBuilder append(String fieldName, byte value) { style.append(buffer, fieldName, value); return this; } /** *

Append to the toString a byte array.

* * @param fieldName the field name * @param array the array to add to the toString * @return this */ public ToStringBuilder append(String fieldName, byte[] array) { style.append(buffer, fieldName, array, null); return this; } /** *

Append to the toString a byte * array.

* *

A boolean parameter controls the level of detail to show. * Setting true will output the array in full. Setting * false will output a summary, typically the size of * the array. * * @param fieldName the field name * @param array the array to add to the toString * @param fullDetail true for detail, false * for summary info * @return this */ public ToStringBuilder append(String fieldName, byte[] array, boolean fullDetail) { style.append(buffer, fieldName, array, BooleanUtils.toBooleanObject(fullDetail)); return this; } /** *

Append to the toString a char * value.

* * @param fieldName the field name * @param value the value to add to the toString * @return this */ public ToStringBuilder append(String fieldName, char value) { style.append(buffer, fieldName, value); return this; } /** *

Append to the toString a char * array.

* * @param fieldName the field name * @param array the array to add to the toString * @return this */ public ToStringBuilder append(String fieldName, char[] array) { style.append(buffer, fieldName, array, null); return this; } /** *

Append to the toString a char * array.

* *

A boolean parameter controls the level of detail to show. * Setting true will output the array in full. Setting * false will output a summary, typically the size of * the array.

* * @param fieldName the field name * @param array the array to add to the toString * @param fullDetail true for detail, false * for summary info * @return this */ public ToStringBuilder append(String fieldName, char[] array, boolean fullDetail) { style.append(buffer, fieldName, array, BooleanUtils.toBooleanObject(fullDetail)); return this; } /** *

Append to the toString a double * value.

* * @param fieldName the field name * @param value the value to add to the toString * @return this */ public ToStringBuilder append(String fieldName, double value) { style.append(buffer, fieldName, value); return this; } /** *

Append to the toString a double * array.

* * @param fieldName the field name * @param array the array to add to the toString * @return this */ public ToStringBuilder append(String fieldName, double[] array) { style.append(buffer, fieldName, array, null); return this; } /** *

Append to the toString a double * array.

* *

A boolean parameter controls the level of detail to show. * Setting true will output the array in full. Setting * false will output a summary, typically the size of * the array.

* * @param fieldName the field name * @param array the array to add to the toString * @param fullDetail true for detail, false * for summary info * @return this */ public ToStringBuilder append(String fieldName, double[] array, boolean fullDetail) { style.append(buffer, fieldName, array, BooleanUtils.toBooleanObject(fullDetail)); return this; } /** *

Append to the toString an float * value.

* * @param fieldName the field name * @param value the value to add to the toString * @return this */ public ToStringBuilder append(String fieldName, float value) { style.append(buffer, fieldName, value); return this; } /** *

Append to the toString a float * array.

* * @param fieldName the field name * @param array the array to add to the toString * @return this */ public ToStringBuilder append(String fieldName, float[] array) { style.append(buffer, fieldName, array, null); return this; } /** *

Append to the toString a float * array.

* *

A boolean parameter controls the level of detail to show. * Setting true will output the array in full. Setting * false will output a summary, typically the size of * the array.

* * @param fieldName the field name * @param array the array to add to the toString * @param fullDetail true for detail, false * for summary info * @return this */ public ToStringBuilder append(String fieldName, float[] array, boolean fullDetail) { style.append(buffer, fieldName, array, BooleanUtils.toBooleanObject(fullDetail)); return this; } /** *

Append to the toString an int * value.

* * @param fieldName the field name * @param value the value to add to the toString * @return this */ public ToStringBuilder append(String fieldName, int value) { style.append(buffer, fieldName, value); return this; } /** *

Append to the toString an int * array.

* * @param fieldName the field name * @param array the array to add to the toString * @return this */ public ToStringBuilder append(String fieldName, int[] array) { style.append(buffer, fieldName, array, null); return this; } /** *

Append to the toString an int * array.

* *

A boolean parameter controls the level of detail to show. * Setting true will output the array in full. Setting * false will output a summary, typically the size of * the array.

* * @param fieldName the field name * @param array the array to add to the toString * @param fullDetail true for detail, false * for summary info * @return this */ public ToStringBuilder append(String fieldName, int[] array, boolean fullDetail) { style.append(buffer, fieldName, array, BooleanUtils.toBooleanObject(fullDetail)); return this; } /** *

Append to the toString a long * value.

* * @param fieldName the field name * @param value the value to add to the toString * @return this */ public ToStringBuilder append(String fieldName, long value) { style.append(buffer, fieldName, value); return this; } /** *

Append to the toString a long * array.

* * @param fieldName the field name * @param array the array to add to the toString * @return this */ public ToStringBuilder append(String fieldName, long[] array) { style.append(buffer, fieldName, array, null); return this; } /** *

Append to the toString a long * array.

* *

A boolean parameter controls the level of detail to show. * Setting true will output the array in full. Setting * false will output a summary, typically the size of * the array.

* * @param fieldName the field name * @param array the array to add to the toString * @param fullDetail true for detail, false * for summary info * @return this */ public ToStringBuilder append(String fieldName, long[] array, boolean fullDetail) { style.append(buffer, fieldName, array, BooleanUtils.toBooleanObject(fullDetail)); return this; } /** *

Append to the toString an Object * value.

* * @param fieldName the field name * @param obj the value to add to the toString * @return this */ public ToStringBuilder append(String fieldName, Object obj) { style.append(buffer, fieldName, obj, null); return this; } /** *

Append to the toString an Object * value.

* * @param fieldName the field name * @param obj the value to add to the toString * @param fullDetail true for detail, * false for summary info * @return this */ public ToStringBuilder append(String fieldName, Object obj, boolean fullDetail) { style.append(buffer, fieldName, obj, BooleanUtils.toBooleanObject(fullDetail)); return this; } /** *

Append to the toString an Object * array.

* * @param fieldName the field name * @param array the array to add to the toString * @return this */ public ToStringBuilder append(String fieldName, Object[] array) { style.append(buffer, fieldName, array, null); return this; } /** *

Append to the toString an Object * array.

* *

A boolean parameter controls the level of detail to show. * Setting true will output the array in full. Setting * false will output a summary, typically the size of * the array.

* * @param fieldName the field name * @param array the array to add to the toString * @param fullDetail true for detail, false * for summary info * @return this */ public ToStringBuilder append(String fieldName, Object[] array, boolean fullDetail) { style.append(buffer, fieldName, array, BooleanUtils.toBooleanObject(fullDetail)); return this; } /** *

Append to the toString an short * value.

* * @param fieldName the field name * @param value the value to add to the toString * @return this */ public ToStringBuilder append(String fieldName, short value) { style.append(buffer, fieldName, value); return this; } /** *

Append to the toString a short * array.

* * @param fieldName the field name * @param array the array to add to the toString * @return this */ public ToStringBuilder append(String fieldName, short[] array) { style.append(buffer, fieldName, array, null); return this; } /** *

Append to the toString a short * array.

* *

A boolean parameter controls the level of detail to show. * Setting true will output the array in full. Setting * false will output a summary, typically the size of * the array. * * @param fieldName the field name * @param array the array to add to the toString * @param fullDetail true for detail, false * for summary info * @return this */ public ToStringBuilder append(String fieldName, short[] array, boolean fullDetail) { style.append(buffer, fieldName, array, BooleanUtils.toBooleanObject(fullDetail)); return this; } /** *

Appends with the same format as the default Object toString() * method. Appends the class name followed by * {@link System#identityHashCode(java.lang.Object)}.

* * @param object the Object whose class name and id to output * @return this * @since 2.0 */ public ToStringBuilder appendAsObjectToString(Object object) { ObjectUtils.identityToString(this.getStringBuffer(), object); return this; } //---------------------------------------------------------------------------- /** *

Append the toString from the superclass.

* *

This method assumes that the superclass uses the same ToStringStyle * as this one.

* *

If superToString is null, no change is made.

* * @param superToString the result of super.toString() * @return this * @since 2.0 */ public ToStringBuilder appendSuper(String superToString) { if (superToString != null) { style.appendSuper(buffer, superToString); } return this; } /** *

Append the toString from another object.

* *

This method is useful where a class delegates most of the implementation of * its properties to another class. You can then call toString() on * the other class and pass the result into this method.

* *
     *   private AnotherObject delegate;
     *   private String fieldInThisClass;
     *
     *   public String toString() {
     *     return new ToStringBuilder(this).
     *       appendToString(delegate.toString()).
     *       append(fieldInThisClass).
     *       toString();
     *   }
* *

This method assumes that the other object uses the same ToStringStyle * as this one.

* *

If the toString is null, no change is made.

* * @param toString the result of toString() on another object * @return this * @since 2.0 */ public ToStringBuilder appendToString(String toString) { if (toString != null) { style.appendToString(buffer, toString); } return this; } /** *

Returns the Object being output.

* * @return The object being output. * @since 2.0 */ public Object getObject() { return object; } /** *

Gets the StringBuffer being populated.

* * @return the StringBuffer being populated */ public StringBuffer getStringBuffer() { return buffer; } //---------------------------------------------------------------------------- /** *

Gets the ToStringStyle being used.

* * @return the ToStringStyle being used * @since 2.0 */ public ToStringStyle getStyle() { return style; } /** *

Returns the built toString.

* *

This method appends the end of data indicator, and can only be called once. * Use {@link #getStringBuffer} to get the current string state.

* *

If the object is null, return the style's nullText

* * @return the String toString */ public String toString() { if (this.getObject() == null) { this.getStringBuffer().append(this.getStyle().getNullText()); } else { style.appendEnd(this.getStringBuffer(), this.getObject()); } return this.getStringBuffer().toString(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy