我是否隐藏WeakReferences的impl或强制客户端使用它们

时间:2014-01-30 13:41:52

标签: java api weak-references

如果我使用WeakReference来允许听众不要抓住周围的物体。 我的客户面向API是否应该强制使用弱引用,还是我应该在内部处理并且不暴露这种复杂性?此外,测试的影响是什么。即我可以模拟一个监听器,但如果我'新建'监听器内的弱引用,当WeakRefernece变为空时,我将无法测试流。

WeakReference JavaDoc

例如:

interface TaskListener {
    void callback();
}

不要公开WeakReference

class MyClass {

    private TaskListener;

    public void runTask() {
        taskListener = new TaskListener(){

            @Override
            public void callback() {

            }
        }
        task.setListener(taskListener);
        task.run();
    }

}

IMPL:

class Task {

    public void setListener(TaskListener listener) {
        this.listener = new WeakReference<TaskListener>(listener);    
    }

}

公开WeakReference:

class MyClass {

    private WeakReference<TaskListener>;

    public void runTask() {
        taskListener = new WeakReference<TaskListener>(new TaskListener(){

            @Override
            public void callback() {

            }
        })
        task.setListener(taskListener);
        task.run();
    }

}

IMPL:

class Task {

    public void setListener(WeakReference<TaskListener> listener) {
        this.listener = listener;
    }

}

1 个答案:

答案 0 :(得分:0)

弱引用是一个实现细节,只是无缘无故地为API用户添加了复杂性。除非他们每次都与弱引用有关,否则让他们传递对象并自己做弱引用。

请注意,虽然这种模式存在局限性,但我之前自己尝试过,并发现它实际上更多的是障碍而不是帮助。因为弱引用被删除我实际上不能只是添加一个监听器然后忘记它 - 我必须在别处保留对该监听器的引用,以阻止它获得GC。

这可能不适用于您的用例,但在许多情况下,侦听器被实现为匿名内部类,并且它们被附加到listen但是没有其他引用保留给它们。如果使用弱引用存储它们,那是不可能的。