【问题标题】:Do I hide the impl of WeakReferences or force the client to use them我是隐藏 WeakReferences 的 impl 还是强制客户端使用它们
【发布时间】:2014-01-30 13:41:51
【问题描述】:

如果我使用WeakReferences 来让听众不要抓住周围的物体。 我的客户端 API 应该强制使用弱引用,还是我应该在内部处理而不暴露这种复杂性? 还有测试的影响是什么。即我可以模拟一个侦听器,但如果我在侦听器内部“新建”弱引用,当WeakRefernece 变为空时,我将无法测试流程。

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

}

【问题讨论】:

  • 您可能应该再考虑一下 - new WeakReference&lt;&gt;(new Whatever()) 可能导致弱引用不引用任何内容,因为新创建的对象在任何地方都没有被强引用(除非它在其构造函数的某处创建对自身的引用) .
  • @Njol 是的,这只是示例,我会在课堂上提供参考。我可以更新
  • 我会选择第一个,因为您可能希望让您的 API 尽可能干净且易于使用。但是,您应该记录内部 WeakReferences 用于管理侦听器。

标签: java api weak-references


【解决方案1】:

弱引用是一个实现细节,无缘无故地给 API 用户增加了复杂性。除非他们都与弱引用有关,否则让他们将对象传入并自己进行弱引用。

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

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

【讨论】:

  • "我还必须在别处保留对该侦听器的引用,以阻止它获得 GC" 保留对侦听器的另一个引用?那么它不会使 WeakReference 变得毫无意义吗?
  • 是的。这就是我删除弱引用的原因。但是,在某些情况下它可能有用。如果您有正在其他地方使用的业务对象并且也是侦听器,那么您可能希望添加它们来侦听事物,但仍然让它们具有 GCd。即使这样也不是很理想,因为您可以删除对某些内容的所有引用,但它仍然会在之后的未知时间内接收事件并浪费资源。基本上最后我认为弱引用对听众没有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2011-03-29
  • 2021-10-04
  • 2015-12-10
  • 1970-01-01
相关资源
最近更新 更多