2008-09-22 4 views
2

(Java question)Как вы разрешаете циклическую зависимость с внутренним классом?

Если я ссылаюсь на поле во внутреннем классе, вызывает ли это круговую зависимость между окружающим классом и внутренним классом?

Как этого избежать?

Вот пример:

public class Outer { 

    private Other o; 
    private Inner i;  

    public Outer() { 
    o = new Other(); 

    i = new Inner() { 
     public void doSomething() { 
     o.foo(); 
     } 
    }; 

    } 
} 
+0

Outer, Other, Inner Вы хотите иметь три класса? – jjnguy 2008-09-22 23:49:48

ответ

10

Static vs class class: Если вы объявляете внутренний класс статическим, то экземпляры внутреннего класса не имеют ссылки на внешний класс. Если это не satic, то ваш внутренний объект efectivelly указывает на внешний объект, который его создал (он имеет неявную ссылку, фактически, если вы используете отражение над его конструкторами, вы увидите дополнительный параметр для получения внешнего экземпляра).

Внутренние экземпляры экземпляра внешнего экземпляра: Циркулярная ссылка на случай, если каждый экземпляр указывает другой. Много раз вы используете внутренние классы для элегантного внедрения некоторого интерфейса и доступа к закрытым полям, не реализуя интерфейс с внешним классом. Это означает, что внутренний экземпляр указывает внешний экземпляр, но не означает обратное. Не требуется круговая ссылка.

Закрытие круга: В любом случае, нет ничего плохого в круговых ссылках на Java. Объекты работают красиво, и когда их больше не ссылают, они собираются мусором. Неважно, если они указывают друг на друга.

0

Синтаксиса вы используете в примере поодаль нет объявления класса или интерфейса Inner. Но нет ничего плохого в концепции примера. В Java он будет работать нормально.

Я не уверен, что вы здесь делаете, но вы можете рассмотреть более простой дизайн для ремонтопригодности и т.д.

Это общий шаблон для анонимных обработчиков событий ссылаться на элементы своего родительского класса, поэтому нет причин, чтобы избежать этого, если это так, так как Java был разработан вместо указателей на функции.

0

(Не уверен, если это то, что вы просите ...)

Во время выполнения, внутренний класс имеет неявную ссылку на экземпляр внешнего класса он принадлежит. Поэтому всякий раз, когда вы передаете внутренний экземпляр класса, вы также передаете экземпляр внешнего класса.
Вы можете избежать этого, объявив внутренний класс как «статический», но это значит, что внутренний класс не может получить доступ к переменным-членам внешнего класса. Поэтому в этом случае, если вы хотите получить доступ к члену внешнего класса, вам нужно явно передать его во внутренний класс (используя установщик или используя конструктор внутреннего класса).

Смежные вопросы