Я читаю книгу Java concurrency in practice, в разделе 3.2, он дает следующий пример кода для иллюстрации неявно позволяя this
ссылки бежать (Не делайте этого, Especailly в конструкторе):создать экземпляр внутреннего класса в конструкторе
public class ThisEscape {
public ThisEscape(EventSource source) {
source.registerListener (
new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
}
);
}
}
книга затем говорит:
Когда
ThisEscape
публикуетEventListener
, неявно публикует охватывающуюThisEscape
экземпляр, а также, потому что внутренняя экземпляры классов содержат скрытую ссылку на экземпляр-экземпляр.
Я понимаю вышеупомянутые слова с точки зрения Java, но я не могу придумать пример того, как могут EventListener
избежать ограждающих ссылок приведенного выше кода в this
быть вредными? В каком смысле?
Например, если я создаю новый экземпляр ThisEscape
:
ThisEscape myEscape = new Escape(mySource);
Тогда что? Как это вредно сейчас? В каком смысле это вредно?
Может ли кто-нибудь использовать код выше в качестве базы и объяснить мне, как это вредно?
======= MORE ======
Книга пытается сказать что-то вроде анонимного EventListener
имеет скрытую ссылку на вмещающем экземпляр класса, который еще не полностью построенный. Я хочу знать, например, как можно неправильно использовать эту не полностью сконструированную ссылку, и я предпочитаю видеть пример кода по этому вопросу.
Книга дает правильный способ делать вещи, это использовать статический фабричный метод, как показано ниже:
public static SafeListener newInstance(EventSource source) {
SafeListener safe = new SafeListener();
source.registerListener (safe.listener);
return safe;
}
Я просто не получить точку целиком.
Спасибо, что задали этот вопрос. – Tirath