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