“发布”一个对象的意思是指,使对象能够在当前作用域之外的代码中使用。当某个不应该发布的对象被发布时,这种情况就背称为“逸出”。发布对象的最简单的方法是将对象的引用保存到一个公有的静态变量中,以便任何类和线程都能看见该对象。例如:
public static <Secret> knownSecrets; public void initialize(){ knownSecrets = new HashSet<Secret>(); }
当发布某个对象时,可能会间接地发布其他对象,在该对象的非私有域中引用的所有对象同样会被发布。
public class ThisEscape{ public ThisEscape(EventSource source){ new EventListener(){ public void onEvent(Event e){ doSomething(e); } } } }
在ThisEscape中给出的一个特殊示例,即this引用在构造函数中逸出。在构造过程中使this引用逸出的一个常见错误是,在构造函数中启动一个线程。当对象在其构造航书中创建一个线程时,,this引用都会被新创建的线程共享。在对象尚未完全构造之前,新的线程就可以看见他。在构造函数中创建线程没有错误,但最好不要立即启动它,而是通过一个start或者initialize方法来启动。
public class SafeListener { private final EventListener listener; private SafeListener(){ listener = new EventListener(){ public void onEvent(Event e){ doSomething(e); } }; }//end safeListener(); public static SafeListener newInstance(EventSource source){ SafeListener safe = new SafeListener(); source.registerListener(safe.listener); return safe; }//end newInstance() }