如果我使用WeakReference
来允许听众不要抓住周围的物体。 我的客户面向API是否应该强制使用弱引用,还是我应该在内部处理并且不暴露这种复杂性?此外,测试的影响是什么。即我可以模拟一个监听器,但如果我'新建'监听器内的弱引用,当WeakRefernece
变为空时,我将无法测试流。
例如:
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;
}
}
答案 0 :(得分:0)
弱引用是一个实现细节,只是无缘无故地为API用户添加了复杂性。除非他们每次都与弱引用有关,否则让他们传递对象并自己做弱引用。
请注意,虽然这种模式存在局限性,但我之前自己尝试过,并发现它实际上更多的是障碍而不是帮助。因为弱引用被删除我实际上不能只是添加一个监听器然后忘记它 - 我必须在别处保留对该监听器的引用,以阻止它获得GC。
这可能不适用于您的用例,但在许多情况下,侦听器被实现为匿名内部类,并且它们被附加到listen但是没有其他引用保留给它们。如果使用弱引用存储它们,那是不可能的。