Add getChars to CharSequence

Ulf Zibis Ulf.Zibis at CoSoCo.de
Tue Apr 23 04:11:32 UTC 2013


Am 22.04.2013 21:45, schrieb Martin Buchholz:
> Another preliminary webrev is out at
> http://cr.openjdk.java.net/~martin/webrevs/openjdk8/getChars/ 
> <http://cr.openjdk.java.net/%7Emartin/webrevs/openjdk8/getChars/>
>
> Alan et al: Before continuing, can we:
>
> Have thumbs up on the changes to out of bounds exceptions?

This looks great, but AbstractStringBuilder could be again simplified ...

1. What is the difference between replaceOutOfBounds() and substringOutOfBounds() ? ;-)

2. naming suggestion:
     outOfBoundsMsg() --> outOfSrcBoundsMsg()
     replaceOutOfBounds(), substringOutOfBounds() --> outOfDstBoundsMsg()

3. You could rename the parameters of getChars to:
     getChars(int start, int end, char[] dst, int dstStart)
     Then you only need one method: outOfBoundsMsg() !!
     Note that append(CharSequence s, int start, int end), calling getChars(), also uses start, end.

4. Instead:
         if (start < 0 || start > end || end > count)
     you could write:
         if (start < 0 || end - start < 0 || end > count)
     because result of end - start could be reused later.

5. One more abstraction:
     int checkBounds(int start, int end, int count) {
         int len = end - start;
         if (start < 0 || len < 0 || end > count)
             throw new StringIndexOutOfBoundsException
                 (outOfBoundsMsg(start, end, count));
         return len;
     }

6. insert() methods should likewise throw SIOOBE instead IOOBE.
     Then likewise outOfBoundsMsg() could be used.

7.:
  504         int newCount = count + end - start; // remember in local variable
  505         ensureCapacityInternal(newCount);
  506         s.getChars(start, end, value, count); // can reuse result of end - start if GIT-inlined
  507         count = newCount ;


8.:
  819         int remainingStart = start + str.length();
  820         int remaining = count - regionEnd;
  821         int newCount = remainingStart + remaining;
  822         ensureCapacityInternal(newCount);
  823         System.arraycopy(value, regionEnd,
  824                          value, remainingStart, remaining);

9.:
1128         tail = count - dstOffset;
1129         if ((dstOffset < 0) || (tail < 0))
1130             throw new IndexOutOfBoundsException("dstOffset "+dstOffset);
1131         int len = checkBounds(start, end, s.length());
1132         int newCount = count + len;
1133         ensureCapacityInternal(newCount);
1134         System.arraycopy(value, dstOffset, value, newCount - tail, tail);
1137         s.getChars(start, end, value, dstOffset);
1138         count = newCount;


-Ulf




More information about the core-libs-dev mailing list