У меня есть класс CircularBuffer, который расширяет AbstractList.Java: Доступ к встроенным защищенным членам внутреннего класса
У меня есть второй класс ExponentialUnrolledLinkedList, который имеет внутренний класс Node, который расширяет CircularBuffer.
Я могу получить доступ к некоторым защищенным членам экземпляров узла в ExponentialUnrolledLinkedList (вне узла), даже если они объявлены вне узла (например, поле защищенного размера, объявленное в 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;
}
}
Почему я могу получить доступ в размер как внутренний класс и класс Outter, но я могу получить доступ только modCount во внутреннем классе? Я был под (явно ложным) впечатлением, что классы ауттера имеют доступ ко всему, к чему имеют доступ их внутренние классы. Очевидно, что некоторые защищенные члены доступны для обоих, но некоторые из них не являются. У меня есть обход, обертывая приращение modCount в (частный) метод и вызывая этот метод, но это кажется неэлегантным.
CircularBuffer.size защищен и объявлен в CircularBuffer. Вы упомянули, что защита также подразумевает доступ к уровню пакета (по умолчанию). Я не знал об этом. Это объясняет, почему я могу получить доступ к CircularBuffer.size в ExponentialUnrolledLinkedList. это не потому, что у меня есть внутренний класс, полученный из CircularBuffer, потому что CircularBuffer и ExponentialUnrolledLinkedList находятся в одном пакете. Я предполагаю, что доступ к внешнему классу не имеет никакого отношения к тому, к чему могут обратиться его внутренние классы. – Nick