(Вопрос по Java)
Если я ссылаюсь на поле во внутреннем классе, вызывает ли это циклическую зависимость между охватывающим классом и внутренним классом?
Как мне этого избежать?
Вот пример:
public class Outer {
private Other o;
private Inner i;
public Outer() {
o = new Other();
i = new Inner() {
public void doSomething() {
o.foo();
}
};
}
}




Синтаксис, который вы используете в примере, немного отличается, поскольку нет объявления класса или интерфейса Inner. Но в концепции примера нет ничего плохого. На Java все будет нормально.
Я не уверен, что вы здесь делаете, но вы можете подумать о более простом дизайне для удобства обслуживания и т. д.
Это обычный шаблон для анонимных обработчиков событий для ссылки на элементы их родительского класса, поэтому нет причин избегать этого, если это так, поскольку Java была разработана вместо указателей на функции.
(Не уверен, что это то, о чем вы спрашиваете ...)
Во время выполнения внутренний класс имеет неявную ссылку на экземпляр внешнего класса, которому он принадлежит. Поэтому всякий раз, когда вы передаете экземпляр внутреннего класса, вы также передаете экземпляр внешнего класса. Вы можете избежать этого, объявив внутренний класс «статическим», но это означает, что внутренний класс не может получить доступ к переменным-членам внешнего класса. Итак, в этом случае, если вы хотите получить доступ к члену внешнего класса, вам необходимо явно передать его внутреннему классу (с помощью установщика или с помощью конструктора внутреннего класса).
Статический против класса экземпляра: Если вы объявляете внутренний класс статическим, то экземпляры внутреннего класса не имеют ссылки на внешний класс. Если это не satic, то ваш внутренний объект фактически указывает на внешний объект, который его создал (фактически, у него есть неявная ссылка, если вы используете отражение над его конструкторами, вы увидите дополнительный параметр для получения внешнего экземпляра).
Внутренний экземпляр указывает на внешний экземпляр: Круговая ссылка на случай, если каждый экземпляр указывает на другой. Часто вы используете внутренние классы для элегантной реализации некоторого интерфейса и доступа к закрытым полям, не реализуя интерфейс с внешним классом. Это действительно означает, что внутренний экземпляр указывает на внешний экземпляр, но не означает обратного. Не требуется циркулярная ссылка.
Замыкая круг: В любом случае в Java нет ничего плохого в циклических ссылках. Объекты работают нормально, и когда на них больше не ссылаются, они собирают мусор. Неважно, указывают ли они друг на друга.
Внешний, Другой, Внутренний, вы хотите иметь три класса?