У меня есть класс CircularBuffer, который расширяет AbstractList.
У меня есть второй класс ExponentialUnrolledLinkedList, который имеет внутренний класс Node, расширяющий CircularBuffer.
Я могу получить доступ к некоторым защищенным элементам экземпляров Node в ExponentialUnrolledLinkedList (вне Node), даже если они объявлены вне Node (например, поле защищенного размера, объявленное в 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 в (приватный) метод и вызывая этот метод, но это кажется не элегантным.