java - 我是隐藏 WeakReferences 的含义还是强制客户端使用它们

标签 java api weak-references

如果我使用 WeakReference 来允许听众不捕获周围的对象。 我的面向客户端的 API 应该强制使用弱引用,还是我应该在内部处理而不暴露这种复杂情况?还有测试的影响是什么。即我可以模拟一个监听器,但如果我“更新”监听器内部的弱引用,当 WeakRefernece 变为 null 时,我将无法测试流程。

WeakReference JavaDoc

例如:

interface TaskListener {
    void callback();
}

不要暴露弱引用

class MyClass {

    private TaskListener;

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

            @Override
            public void callback() {

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

}

实现:

class Task {

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

}

暴露弱引用:

class MyClass {

    private WeakReference<TaskListener>;

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

            @Override
            public void callback() {

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

}

实现:

class Task {

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

}

最佳答案

弱引用是一个实现细节,无缘无故地为 API 用户增加了复杂性。除非他们都打算处理弱引用,否则只是让他们传入对象并自己进行弱引用。

请注意,尽管此模式存在局限性,但我之前亲自尝试过,发现它实际上是弊大于利。因为弱引用被丢弃,我实际上不能只添加一个监听器然后忘记它 - 我还必须在其他地方保留对该监听器的引用只是为了阻止它获得 GC。

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

关于java - 我是隐藏 WeakReferences 的含义还是强制客户端使用它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21458144/

相关文章:

java - 最好的 jar 组织策略是什么?

java - 如何防止我的客户经常使用演示 Java 程序?

c++ - 使用 IPC 共享内存的应用程序可以访问彼此的代码吗?

ios - 在 Swift 中,无主与弱引用

swift - 不能对 Swift 中的闭包进行弱引用

java - 如何让 ExecutorService 中的线程进入等待阶段

java - 使用 MavenXpp3Reader/MavenXpp3Writer 编写 pom 文件时保留/保留 pom xml 结构[元素顺序]

ios - 使用双向弱指针

javascript - 在 Node.js 上的 JS 中,将数据、数组/文件/其他地方的 "a lot"放在哪里

javascript - 替代 Facebook 评论框插件?