Why ArrayList's non-static inner class SubList has a member variable "parent"?

arraylist, java, sublist

Solution

Your conclusion in the comments is correct. `SubList` requires a `parent` field because sub-lists of a `SubList` use the `SubList` as the parent -- the enclosing `ArrayList` is not the parent in that case. In particular, the source for ArrayList.SubList.subList() is:

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

Note that `this` (a `SubList`) is passed as the parent parameter to the new `SubList`.

There would be no way to track this without an explicit `parent` field.

Problem

java.util.ArrayList.SubList is a non-static inner class class of java.util.ArrayList, which means that it holds an reference to its enclosing class. We can access the members of java.util.ArrayList by using ArrayList.this. But java.util.ArrayList.SubList also has a member "parent" which is also a reference to the enclosing class of java.util.ArrayList.SubList. Why the "parent" member variable is needed or why not declare java.util.ArrayList.SubList as a static inner class? My jdk is the latest, and I had searched google for the latest source code of java.util.ArrayList. I got the following link: http://www.docjar.com/html/api/java/util/ArrayList.java.html. The code on the page is the same as that on my computer.

Original source