问与答

Q1. 以下代码有逸出,求解?

书中说道:当ThisEscape发布EventListener时,它也无条件地发布了封装ThisEscape的实例,因为内引类的实例包含了对封装实例隐含的引用。

1
2
3
4
5
6
7
8
9
10
11
public class  {
public (EventSource source) {
source.registerListener {
new EvenetListener() {
public void onEvent(Event e) {
doSomething(e);
}
}
}
}
}

使用工厂方法防止this引用在构造期间逸出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SafeListener {
private final EvenetListener listener;

private SafeListener() {
listener = new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
}
}

public static SafeListener newInstance(EventSource source) {
SafeListener safe = new SafeListener();
source.registerListener(safe.listener);
return safe;
}
}