何为Escape, 类的成员变量理应不暴露给其他对象,但是却因为某些公有函数暴露出去了,这样就叫做Escape。
接下来列举一些例子:
1.
class UnsafeStates {
private String[] states = new String[] {
"AK", "AL" ...
};
public String[] getStates() { return states; }
}
2. 把内部类EventListener通过方法registerListener传给了source对象。source可能会在registerListener方法中通过内部类EventListener拿到ThisEscape的地址,并进行操作,这个时候就可能会有错误,因为这个时候ThisEscape还没有完全实例化。
public class ThisEscape {
public ThisEscape(EventSource source) {
source.registerListener(
new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
});
}
}
第二种情况的解决方法:用一个工程方法代替私有的构造函数。
public class SafeListener {
private final EventListener 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;
}
}