2010-12-13 3 views
0

У меня есть класс 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 в (частный) метод и вызывая этот метод, но это кажется неэлегантным.

ответ

0

Какова видимость CircularBuffer.size? (Он не является членом AbstractList или его суперклассами).

Вы не можете получить доступ к CircularBuffer.modCount, потому что его видимость «защищена» в классе AbstractList. Это означает, что к члену можно получить доступ только в пределах своего собственного пакета и подкласса его класса в другом пакете (например, CircularBuffer).

+0

CircularBuffer.size защищен и объявлен в CircularBuffer. Вы упомянули, что защита также подразумевает доступ к уровню пакета (по умолчанию). Я не знал об этом. Это объясняет, почему я могу получить доступ к CircularBuffer.size в ExponentialUnrolledLinkedList. это не потому, что у меня есть внутренний класс, полученный из CircularBuffer, потому что CircularBuffer и ExponentialUnrolledLinkedList находятся в одном пакете. Я предполагаю, что доступ к внешнему классу не имеет никакого отношения к тому, к чему могут обратиться его внутренние классы. – Nick