[PATCH] AbstractStringBuilder.append(<StringBuilder>)
Isaac Levy
isaac.r.levy at gmail.com
Fri Jun 29 20:02:41 UTC 2018
Would this snippet end up merging two StringBuilders?
String x = "bar" + "foo";
x += "baz" + "biz";
I had trouble reading stringopts.cpp. I was thinking this append might
be common due to implicit StringBuilder creation.
Isaac
On Fri, Jun 29, 2018 at 12:48 PM, Paul Sandoz <paul.sandoz at oracle.com> wrote:
> Hard to reconstruct the culture memory around this. I suspect such a new method was not considered necessary when StringBuilder was added to Java 1.5 given the CharSequence accepting method, and performance was not considered a concern, and I doubt it's a concern now.
>
> (I don’t think there is any circularity that would result from bridge methods if such a method was added.)
>
> Paul.
>
>> On Jun 27, 2018, at 10:22 PM, Martin Buchholz <martinrb at google.com> wrote:
>>
>> I'm fairly sure the append(StringBuilder) overloads were left out
>> intentionally.
>>
>> On Wed, Jun 27, 2018 at 8:57 PM, Isaac Levy <isaac.r.levy at gmail.com> wrote:
>>
>>> AbstractStringBuilder already has append(<StringBuffer>). This patch
>>> adds append(<StringBuilder>).
>>>
>>> The new method improves parity between the two classes. In addition,
>>> combining StringBuilders is presumably common. append(<CharSequence>)
>>> has a couple insteadof checks, which this new method skips.
>>>
>>> -Isaac
>>>
>>>
>>>
>>>
>>> diff --git a/src/java.base/share/classes/java/lang/
>>> AbstractStringBuilder.java
>>> b/src/java.base/share/classes/java/lang/AbstractStringBuilder.java
>>> index 2ef3e53256..1fe89bb92a 100644
>>> --- a/src/java.base/share/classes/java/lang/AbstractStringBuilder.java
>>> +++ b/src/java.base/share/classes/java/lang/AbstractStringBuilder.java
>>> @@ -543,6 +543,11 @@ abstract class AbstractStringBuilder implements
>>> Appendable, CharSequence {
>>> return this.append((AbstractStringBuilder)sb);
>>> }
>>>
>>> + // Documentation in subclasses because of synchro difference
>>> + public AbstractStringBuilder append(StringBuilder sb) {
>>> + return this.append((AbstractStringBuilder)sb);
>>> + }
>>> +
>>> /**
>>> * @since 1.8
>>> */
>>> diff --git a/src/java.base/share/classes/java/lang/StringBuffer.java
>>> b/src/java.base/share/classes/java/lang/StringBuffer.java
>>> index e597a8112e..613ba90c25 100644
>>> --- a/src/java.base/share/classes/java/lang/StringBuffer.java
>>> +++ b/src/java.base/share/classes/java/lang/StringBuffer.java
>>> @@ -313,6 +313,33 @@ import jdk.internal.HotSpotIntrinsicCandidate;
>>> return this;
>>> }
>>>
>>> + /**
>>> + * Appends the specified {@code StringBuilder} to this sequence.
>>> + * <p>
>>> + * The characters of the {@code StringBuilder} argument are appended,
>>> + * in order, to the contents of this {@code StringBuffer}, increasing
>>> the
>>> + * length of this {@code StringBuffer} by the length of the argument.
>>> + * If {@code sb} is {@code null}, then the four characters
>>> + * {@code "null"} are appended to this {@code StringBuffer}.
>>> + * <p>
>>> + * Let <i>n</i> be the length of the old character sequence, the one
>>> + * contained in the {@code StringBuffer} just prior to execution of
>>> the
>>> + * {@code append} method. Then the character at index <i>k</i> in
>>> + * the new character sequence is equal to the character at index
>>> <i>k</i>
>>> + * in the old character sequence, if <i>k</i> is less than <i>n</i>;
>>> + * otherwise, it is equal to the character at index <i>k-n</i> in the
>>> + * argument {@code sb}.
>>> + * <p>
>>> + *
>>> + * @param sb the {@code StringBuilder} to append.
>>> + * @return a reference to this object.
>>> + */
>>> + public synchronized StringBuffer append(StringBuilder sb) {
>>> + toStringCache = null;
>>> + super.append(sb);
>>> + return this;
>>> + }
>>> +
>>> /**
>>> * Appends the specified {@code StringBuffer} to this sequence.
>>> * <p>
>>> diff --git a/src/java.base/share/classes/java/lang/StringBuilder.java
>>> b/src/java.base/share/classes/java/lang/StringBuilder.java
>>> index 40da2083c2..5ddd4fb5f9 100644
>>> --- a/src/java.base/share/classes/java/lang/StringBuilder.java
>>> +++ b/src/java.base/share/classes/java/lang/StringBuilder.java
>>> @@ -199,6 +199,30 @@ public final class StringBuilder
>>> return this;
>>> }
>>>
>>> + /**
>>> + * Appends the specified {@code StringBuilder} to this sequence.
>>> + * <p>
>>> + * The characters of the {@code StringBuilder} argument are appended,
>>> + * in order, to this sequence, increasing the
>>> + * length of this sequence by the length of the argument.
>>> + * If {@code sb} is {@code null}, then the four characters
>>> + * {@code "null"} are appended to this sequence.
>>> + * <p>
>>> + * Let <i>n</i> be the length of this character sequence just prior to
>>> + * execution of the {@code append} method. Then the character at index
>>> + * <i>k</i> in the new character sequence is equal to the character at
>>> + * index <i>k</i> in the old character sequence, if <i>k</i> is less
>>> than
>>> + * <i>n</i>; otherwise, it is equal to the character at index
>>> <i>k-n</i>
>>> + * in the argument {@code sb}.
>>> + *
>>> + * @param sb the {@code StringBuilder} to append.
>>> + * @return a reference to this object.
>>> + */
>>> + public StringBuilder append(StringBuilder sb) {
>>> + super.append(sb);
>>> + return this;
>>> + }
>>> +
>>> @Override
>>> public StringBuilder append(CharSequence s) {
>>> super.append(s);
>>>
>
More information about the core-libs-dev
mailing list