`

Java Concurrency in practice 笔记

 
阅读更多

何为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;
    }
} 

 

分享到:
评论
1 楼 yanqingluo 2014-01-13  
你弄错了,应该是一个工厂方法防止逃逸.

相关推荐

Global site tag (gtag.js) - Google Analytics