RFR [8014066] Mistake in documentation of ArrayList#removeRange
Martin Buchholz
martinrb at google.com
Tue Mar 18 22:17:01 UTC 2014
modCount is an imprecise concurrent modification mechanism. It doesn't
have to be kept transactionally correct.
On Tue, Mar 18, 2014 at 3:12 PM, Ulf Zibis <Ulf.Zibis at cosoco.de> wrote:
> Am 18.03.2014 19:28, schrieb Ivan Gerasimov:
>
>
>> Assuming this last iteration is OK, should the next step be a CCC request?
>>
>
> Do you mean? :
> /*
> * ...
> + * It is assumed that fromIndex <= toIndex, otherwise the behaviour
> of this method is undefined.
> * ...
> - * toIndex < fromIndex})
> * ...
> */
> protected void removeRange(int fromIndex, int toIndex) {
> ...
>
> Please remove and replace inline by size - toIndex:
> 621 int numMoved = size - toIndex;
>
>
> About modCount:
>
> Wouldn't it be more correct to code? :
>
> 616 if (fromIndex > toIndex) {
> 617 throw new IndexOutOfBoundsException(
> 618 outOfBoundsMsg(fromIndex, toIndex));
> 619 }
> 620 try {
> 621 modCount++;
> 622 System.arraycopy(elementData, toIndex, elementData,
> fromIndex,
> 623 size - toIndex);
> 624 } catch (IndexOutOfBoundsException ioobe) {
> 625 modCount--;
> 626 throw ioobe;
> 627 }
>
> Of even better :
>
> 000 private int[] modCount = { 0 };
> ...
> 616 if (fromIndex > toIndex) {
> 617 throw new IndexOutOfBoundsException(
> 618 outOfBoundsMsg(fromIndex, toIndex));
> 619 }
> 620 System.arraycopy(elementData, toIndex, elementData, fromIndex,
> 621 size - toIndex, modCount);
>
> Or :
>
> 000 public class ArrayList ... implements ModCounter {
> 001 private int modCount = 0;
> 001 void incModCount() {
> 001 modCount++;
> 004 }
> ...
> 616 if (fromIndex > toIndex) {
> 617 throw new IndexOutOfBoundsException(
> 618 outOfBoundsMsg(fromIndex, toIndex));
> 619 }
> 620 System.arraycopy(elementData, toIndex, elementData, fromIndex,
> 621 size - toIndex, this);
>
> -Ulf
>
>
>
More information about the core-libs-dev
mailing list