On Thu, 23 Feb 2023 13:13:43 GMT, Jim Laskey <jlas...@openjdk.org> wrote:

> Add the ability to repeatedly append char and CharSequence data to 
> StringBuilder/StringBuffer.

src/java.base/share/classes/java/lang/AbstractStringBuilder.java line 1839:

> 1837:      * @throws StringIndexOutOfBoundsException  if the result overflows 
> the buffer
> 1838:      */
> 1839:     public AbstractStringBuilder repeat(char c, int count) {

The shadowing of the count field is a hidden maintenance trap.

src/java.base/share/classes/java/lang/AbstractStringBuilder.java line 1867:

> 1865: 
> 1866:     private AbstractStringBuilder repeatNull(int count) {
> 1867:         if (count < 0) {

This could be implemented as `repeat("null", count)`. Its not likely to be 
performance sensitive and be easier to maintain.

src/java.base/share/classes/java/lang/AbstractStringBuilder.java line 1869:

> 1867:         if (count < 0) {
> 1868:             throw new IllegalArgumentException("count is less than 
> zero: " + count);
> 1869:         } else if (count == 0) {

Inconsistent `if ... else if ...` structure compared to method above.

src/java.base/share/classes/java/lang/AbstractStringBuilder.java line 1876:

> 1874:         int length = this.count - offset;
> 1875:         int valueLength = length << coder;
> 1876:         if ((Integer.MAX_VALUE - offset) / count < valueLength) {

Can this check be done with multiply instead of divide?

src/java.base/share/classes/java/lang/AbstractStringBuilder.java line 1879:

> 1877:             throw new OutOfMemoryError("Required length exceeds 
> implementation limit");
> 1878:         }
> 1879:         int limit = count * length;

The meaning of limit should be consistent across uses.  Above it is an index 
into the buffer; here it is an offset.

src/java.base/share/classes/java/lang/AbstractStringBuilder.java line 1904:

> 1902:     public AbstractStringBuilder repeat(CharSequence cs, int count) {
> 1903:         if (cs == null) {
> 1904:             return repeatNull(count);

Or just replace `cs = "null";` and fall through to the rest.

-------------

PR: https://git.openjdk.org/jdk/pull/12728

Reply via email to