根據面向對象編程的基本原則,數據應儘量的隱蔽。而ArrayList中的成員變量elementData卻選擇了默認可見性,也就是包可見性。源碼中的註釋爲non-private to simplify nested class access,爲了嵌套類可達。但即使外部類的成員變量爲private,非靜態嵌套類依然可達。
例如在內部類Itr,無論外部成員變量elementData是否爲private,Itr均可訪問。
ArrayList部分源碼如下,
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
transient Object[] elementData; // non-private to simplify nested class access
private int size;
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor;
int lastRet = -1;
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
...
}
}