Как вы разрешаете циклическую зависимость с помощью внутреннего класса?

StackOverflow https://stackoverflow.com/questions/118272

Вопрос

(Вопрос по Java)

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

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

Вот такой пример:

public class Outer {

  private Other o;
  private Inner i;    

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

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

  }
}
Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top