У меня есть класс CircularBuffer, который расширяет AbstractList.
У меня есть второй класс ExponentialUnrolledLinkedList, который имеет внутренний класс Node, который расширяет CircularBuffer.
Я могу получить доступ к некоторым защищенным членам экземпляров Node в ExponentialUnrolledLinkedList (вне Node), даже если они объявлены вне Node (например, защищенное поле size, объявленное в CircularBuffer), но не защищенное поле modCount, объявленное в AbstractList.
Я могу получить доступ к modCount из самого определения внутреннего класса, но не из окружающего класса.
Например
public class ExponentialUnrolledLinkedList<E> extends AbstractSequentialList<E> {
...
private Node last = new Node(1){
protected int firstIndex(){
return 0;
}
};
private class Node extends CircularBuffer<E> {
...
private void dirty(){
this.modCount++; // works
}
protected int firstIndex(){
return store.length;
}
}
public int size(){
return last.firstIndex() + last.size; // access to last.size works
}
public boolean add(E item){
...
last.modCount++; // can't access modCount, have to call last.dirty()
...
return true;
}
}
Почему я могу получить доступ к размеру как во внутреннем, так и во внешнем классе, но я могу получить доступ к modCount только во внутреннем классе? У меня сложилось (очевидно ложное) впечатление, что внешние классы имеют доступ ко всему, к чему имеют доступ их внутренние классы. Очевидно, что некоторые защищенные элементы доступны для обоих, а некоторые нет. У меня есть обходной путь, заключающий приращение modCount в (частный) метод и вызывающий этот метод, но это кажется неэлегантным.