这是《Java并发编程实战》3.2发布与逸出一节中的示例代码。我无法理解,this是怎么逸出的。
//隐式地使this引用逸出(不要这么做)
public class ThisEscape {
public ThisEscape(EventSource source){
source.registerListener(new EventListener() {
public void onEvent(Event e){
doSomething(e);
}
});
}
}
书上说,当ThisEscape发布EventListener时,也隐含地发布了ThisEscape实例本身,因为在这个内部类的实例中包含了对ThisEscape实例的隐含引用。
伊谢尔伦2017-04-18 10:33:22
正直に言うと、私はマルチスレッドとエスケープについてはあまり知りませんが、内部クラスについては理解しているので、強力な答えを与えることができます。内部クラスと匿名内部クラスの両方が、外部クラスのオブジェクトのフィールドにアクセスできます。なぜこのようなことが起こるのでしょうか? 実は、内部クラスが構築されるときに、外部クラスのオブジェクト this が内部クラスのコンストラクターに暗黙的に渡されるため、この作業はコンパイラーによって行われます。パラメータを内部クラスのすべてのコンストラクターに渡すので、例の匿名内部クラスは、ThisEscape を構築するときに、ThisEscape によって作成されたオブジェクトを匿名内部クラスに暗黙的に渡します。これがどのような問題を引き起こすかわかりませんが、onEvent が外部クラスのプライベート ドメインを操作するのではないかと思われます。この部分を教えてほしいです