Hi Paul

On 05.05.2015 19:56, Paul Sandoz wrote:
Hi Ivan,

ArrayList
--

You can simplify SubList with:

private final class SubList extends AbstractList<E> implements RandomAccess {
     private final SubList parent;
     private final int offset;
     int size;

     // Top level sub-list
     SubList(int offset, int fromIndex, int toIndex) {
         this.parent = null;
         this.offset = offset + fromIndex;
         this.size = toIndex - fromIndex;
         this.modCount = ArrayList.this.modCount;
     }

     // Sub sub-lst
     SubList(SubList parent,
             int offset, int fromIndex, int toIndex) {
         this.parent = parent;
         this.offset = offset + fromIndex;
         this.size = toIndex - fromIndex;
         this.modCount = ArrayList.this.modCount;
     }

ArrayList.subList becomes:

public List<E> subList(int fromIndex, int toIndex) {
     subListRangeCheck(fromIndex, toIndex, size);
     return new SubList(0, fromIndex, toIndex);
}

And SubList.subList:

public List<E> subList(int fromIndex, int toIndex) {
     subListRangeCheck(fromIndex, toIndex, size);
     return new SubList(this, offset, fromIndex, toIndex);
}

And SubList. updateSizeAndModCount:

private void updateSizeAndModCount(int sizeChange) {
     int modCount = ArrayList.this.modCount;
     for (SubList slist = this; slist != null; slist = slist.parent) {
         slist.size += sizeChange;
         slist.modCount = modCount;
     }
}

Thanks for suggestion!
I should have realized this myself, that there's no need to set parent to ArrayList.this. It was a left-over from the previous design, when parent was used in different ways.

AbstractList
--

Similar changes can be made as above to ArrayList.SubList etc.

The construction of sub-lists does indeed require a second take. A comment is 
worthwhile. IMO such scoping is not necessary for ArrayList, i have actually 
found it rare to require such scoping so using it when not necessary is rather 
jarring.

Okay, I'll reorganize it to make SubList classes stand-alone, not inner classes.
Let's see, if it makes the things nicer.

NestedSubList
--

My preference is you use a testng data provider so you don't have to roll your 
own failure checking and reporting.
Are there any other tests for testing the integrity of sublists?

I found only a few tests that test some parts of the functionality:
test/java/util/List/LockStep.java
test/java/util/Collection/MOAT.java


I'll post an update on the code and test soon.

Sincerely yours,
Ivan

Reply via email to