LOG4J2-1270 added utility method StringBuilders::appendValue(StringBuilder, Object) that avoids creating temporary objects while appending an Object to a StringBuilder
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/6a3cee06 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/6a3cee06 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/6a3cee06 Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure Commit: 6a3cee062277610d4983452d5e0b8e6d26c78e91 Parents: a414da4 Author: rpopma <[email protected]> Authored: Wed Jul 27 01:26:21 2016 +0900 Committer: rpopma <[email protected]> Committed: Wed Jul 27 01:26:21 2016 +0900 ---------------------------------------------------------------------- .../logging/log4j/util/StringBuilders.java | 38 ++++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6a3cee06/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java index ac9ef62..d6e9962 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java @@ -27,7 +27,7 @@ public final class StringBuilders { /** * Appends in the following format: double quoted value. - * + * * @param sb a string builder * @param value a value * @return {@code "value"} @@ -38,7 +38,7 @@ public final class StringBuilders { /** * Appends in the following format: key=double quoted value. - * + * * @param sb a string builder * @param entry a map entry * @return {@code key="value"} @@ -49,7 +49,7 @@ public final class StringBuilders { /** * Appends in the following format: key=double quoted value. - * + * * @param sb a string builder * @param key a key * @param value a value @@ -59,4 +59,36 @@ public final class StringBuilders { return sb.append(key).append(Chars.EQ).append(Chars.DQUOTE).append(value).append(Chars.DQUOTE); } + /** + * Appends a text representation of the specified object to the specified StringBuilder, + * if possible without allocating temporary objects. + * + * @param stringBuilder the StringBuilder to append the value to + * @param obj the object whose text representation to append to the StringBuilder + */ + public static void appendValue(final StringBuilder stringBuilder, final Object obj) { + if (obj == null || obj instanceof String) { + stringBuilder.append((String) obj); + } else if (obj instanceof StringBuilderFormattable) { + ((StringBuilderFormattable) obj).formatTo(stringBuilder); + } else if (obj instanceof CharSequence) { + stringBuilder.append((CharSequence) obj); + } else if (obj instanceof Integer) { // LOG4J2-1437 unbox auto-boxed primitives to avoid calling toString() + stringBuilder.append(((Integer) obj).intValue()); + } else if (obj instanceof Long) { + stringBuilder.append(((Long) obj).longValue()); + } else if (obj instanceof Double) { + stringBuilder.append(((Double) obj).doubleValue()); + } else if (obj instanceof Boolean) { + stringBuilder.append(((Boolean) obj).booleanValue()); + } else if (obj instanceof Character) { + stringBuilder.append(((Character) obj).charValue()); + } else if (obj instanceof Short) { + stringBuilder.append(((Short) obj).shortValue()); + } else if (obj instanceof Float) { + stringBuilder.append(((Float) obj).floatValue()); + } else { + stringBuilder.append(obj); + } + } }
