这是《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
솔직히 멀티스레딩과 이스케이프에 대해서는 잘 모르지만 내부 클래스는 이해하고 있기 때문에 확실한 답변을 드릴 수 있습니다. 내부 클래스와 익명 내부 클래스 모두 외부 객체의 필드에 접근할 수 있습니다. 실제로 이는 내부 클래스가 생성될 때 외부 클래스의 객체가 암시적으로 내부 클래스의 생성자에 매개변수로 전달되기 때문입니다. 이 매개변수를 내부 클래스의 모든 생성자에 추가하므로 예제의 익명 내부 클래스는 ThisEscape를 생성할 때 암시적으로 ThisEscape에서 생성된 개체를 익명 내부 클래스에 전달합니다. 이로 인해 어떤 문제가 발생할지 모르겠습니다. onEvent가 외부 클래스의 개인 도메인을 운영하게 될까봐 걱정되는 것 같습니다. 이 부분 좀 가르쳐 주세요