aboutsummaryrefslogtreecommitdiffstats
path: root/guava/src/com/google/common/base/Objects.java
diff options
context:
space:
mode:
Diffstat (limited to 'guava/src/com/google/common/base/Objects.java')
-rw-r--r--guava/src/com/google/common/base/Objects.java142
1 files changed, 51 insertions, 91 deletions
diff --git a/guava/src/com/google/common/base/Objects.java b/guava/src/com/google/common/base/Objects.java
index c65f84b..ffac9c4 100644
--- a/guava/src/com/google/common/base/Objects.java
+++ b/guava/src/com/google/common/base/Objects.java
@@ -27,10 +27,6 @@ import javax.annotation.Nullable;
/**
* Helper functions that can operate on any {@code Object}.
*
- * <p>See the Guava User Guide on <a
- * href="http://code.google.com/p/guava-libraries/wiki/CommonObjectUtilitiesExplained">writing
- * {@code Object} methods with {@code Objects}</a>.
- *
* @author Laurence Gonsalves
* @since 2.0 (imported from Google Collections Library)
*/
@@ -98,14 +94,6 @@ public final class Objects {
* .add("x", 1)
* .add("y", "foo")
* .toString();
- * }}
- *
- * // Returns "ClassName{x=1}"
- * Objects.toStringHelper(this)
- * .omitNullValues()
- * .add("x", 1)
- * .add("y", null)
- * .toString();
* }}</pre>
*
* <p>Note that in GWT, class names are often obfuscated.
@@ -193,38 +181,25 @@ public final class Objects {
* @since 2.0
*/
public static final class ToStringHelper {
- private final String className;
- private ValueHolder holderHead = new ValueHolder();
- private ValueHolder holderTail = holderHead;
- private boolean omitNullValues = false;
+ private final StringBuilder builder;
+ private boolean needsSeparator = false;
/**
* Use {@link Objects#toStringHelper(Object)} to create an instance.
*/
private ToStringHelper(String className) {
- this.className = checkNotNull(className);
- }
-
- /**
- * Configures the {@link ToStringHelper} so {@link #toString()} will ignore
- * properties with null value. The order of calling this method, relative
- * to the {@code add()}/{@code addValue()} methods, is not significant.
- *
- * @since 12.0
- */
- public ToStringHelper omitNullValues() {
- omitNullValues = true;
- return this;
+ checkNotNull(className);
+ this.builder = new StringBuilder(32).append(className).append('{');
}
/**
* Adds a name/value pair to the formatted output in {@code name=value}
* format. If {@code value} is {@code null}, the string {@code "null"}
- * is used, unless {@link #omitNullValues()} is called, in which case this
- * name/value pair will not be added.
+ * is used.
*/
public ToStringHelper add(String name, @Nullable Object value) {
- return addHolder(name, value);
+ checkNameAndAppend(name).append(value);
+ return this;
}
/**
@@ -234,7 +209,8 @@ public final class Objects {
* @since 11.0 (source-compatible since 2.0)
*/
public ToStringHelper add(String name, boolean value) {
- return addHolder(name, String.valueOf(value));
+ checkNameAndAppend(name).append(value);
+ return this;
}
/**
@@ -244,7 +220,8 @@ public final class Objects {
* @since 11.0 (source-compatible since 2.0)
*/
public ToStringHelper add(String name, char value) {
- return addHolder(name, String.valueOf(value));
+ checkNameAndAppend(name).append(value);
+ return this;
}
/**
@@ -254,7 +231,8 @@ public final class Objects {
* @since 11.0 (source-compatible since 2.0)
*/
public ToStringHelper add(String name, double value) {
- return addHolder(name, String.valueOf(value));
+ checkNameAndAppend(name).append(value);
+ return this;
}
/**
@@ -264,7 +242,8 @@ public final class Objects {
* @since 11.0 (source-compatible since 2.0)
*/
public ToStringHelper add(String name, float value) {
- return addHolder(name, String.valueOf(value));
+ checkNameAndAppend(name).append(value);
+ return this;
}
/**
@@ -274,7 +253,8 @@ public final class Objects {
* @since 11.0 (source-compatible since 2.0)
*/
public ToStringHelper add(String name, int value) {
- return addHolder(name, String.valueOf(value));
+ checkNameAndAppend(name).append(value);
+ return this;
}
/**
@@ -284,7 +264,13 @@ public final class Objects {
* @since 11.0 (source-compatible since 2.0)
*/
public ToStringHelper add(String name, long value) {
- return addHolder(name, String.valueOf(value));
+ checkNameAndAppend(name).append(value);
+ return this;
+ }
+
+ private StringBuilder checkNameAndAppend(String name) {
+ checkNotNull(name);
+ return maybeAppendSeparator().append(name).append('=');
}
/**
@@ -294,7 +280,8 @@ public final class Objects {
* and give value a readable name.
*/
public ToStringHelper addValue(@Nullable Object value) {
- return addHolder(value);
+ maybeAppendSeparator().append(value);
+ return this;
}
/**
@@ -306,7 +293,8 @@ public final class Objects {
* @since 11.0 (source-compatible since 2.0)
*/
public ToStringHelper addValue(boolean value) {
- return addHolder(String.valueOf(value));
+ maybeAppendSeparator().append(value);
+ return this;
}
/**
@@ -318,7 +306,8 @@ public final class Objects {
* @since 11.0 (source-compatible since 2.0)
*/
public ToStringHelper addValue(char value) {
- return addHolder(String.valueOf(value));
+ maybeAppendSeparator().append(value);
+ return this;
}
/**
@@ -330,7 +319,8 @@ public final class Objects {
* @since 11.0 (source-compatible since 2.0)
*/
public ToStringHelper addValue(double value) {
- return addHolder(String.valueOf(value));
+ maybeAppendSeparator().append(value);
+ return this;
}
/**
@@ -342,7 +332,8 @@ public final class Objects {
* @since 11.0 (source-compatible since 2.0)
*/
public ToStringHelper addValue(float value) {
- return addHolder(String.valueOf(value));
+ maybeAppendSeparator().append(value);
+ return this;
}
/**
@@ -354,7 +345,8 @@ public final class Objects {
* @since 11.0 (source-compatible since 2.0)
*/
public ToStringHelper addValue(int value) {
- return addHolder(String.valueOf(value));
+ maybeAppendSeparator().append(value);
+ return this;
}
/**
@@ -366,63 +358,31 @@ public final class Objects {
* @since 11.0 (source-compatible since 2.0)
*/
public ToStringHelper addValue(long value) {
- return addHolder(String.valueOf(value));
+ maybeAppendSeparator().append(value);
+ return this;
}
/**
* Returns a string in the format specified by {@link
* Objects#toStringHelper(Object)}.
- *
- * <p>After calling this method, you can keep adding more properties to later
- * call toString() again and get a more complete representation of the
- * same object; but properties cannot be removed, so this only allows
- * limited reuse of the helper instance. The helper allows duplication of
- * properties (multiple name/value pairs with the same name can be added).
*/
@Override public String toString() {
- // create a copy to keep it consistent in case value changes
- boolean omitNullValuesSnapshot = omitNullValues;
- String nextSeparator = "";
- StringBuilder builder = new StringBuilder(32).append(className)
- .append('{');
- for (ValueHolder valueHolder = holderHead.next; valueHolder != null;
- valueHolder = valueHolder.next) {
- if (!omitNullValuesSnapshot || valueHolder.value != null) {
- builder.append(nextSeparator);
- nextSeparator = ", ";
-
- if (valueHolder.name != null) {
- builder.append(valueHolder.name).append('=');
- }
- builder.append(valueHolder.value);
- }
+ try {
+ return builder.append('}').toString();
+ } finally {
+ // Slice off the closing brace in case there are additional calls to
+ // #add or #addValue.
+ builder.setLength(builder.length() - 1);
}
- return builder.append('}').toString();
}
- private ValueHolder addHolder() {
- ValueHolder valueHolder = new ValueHolder();
- holderTail = holderTail.next = valueHolder;
- return valueHolder;
- }
-
- private ToStringHelper addHolder(@Nullable Object value) {
- ValueHolder valueHolder = addHolder();
- valueHolder.value = value;
- return this;
- }
-
- private ToStringHelper addHolder(String name, @Nullable Object value) {
- ValueHolder valueHolder = addHolder();
- valueHolder.value = value;
- valueHolder.name = checkNotNull(name);
- return this;
- }
-
- private static final class ValueHolder {
- String name;
- Object value;
- ValueHolder next;
+ private StringBuilder maybeAppendSeparator() {
+ if (needsSeparator) {
+ return builder.append(", ");
+ } else {
+ needsSeparator = true;
+ return builder;
+ }
}
}
}