【发布时间】:2014-01-30 13:41:51
【问题描述】:
如果我使用WeakReferences 来让听众不要抓住周围的物体。 我的客户端 API 应该强制使用弱引用,还是我应该在内部处理而不暴露这种复杂性? 还有测试的影响是什么。即我可以模拟一个侦听器,但如果我在侦听器内部“新建”弱引用,当WeakRefernece 变为空时,我将无法测试流程。
例如:
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<>(new Whatever())可能导致弱引用不引用任何内容,因为新创建的对象在任何地方都没有被强引用(除非它在其构造函数的某处创建对自身的引用) . -
@Njol 是的,这只是示例,我会在课堂上提供参考。我可以更新
-
我会选择第一个,因为您可能希望让您的 API 尽可能干净且易于使用。但是,您应该记录内部 WeakReferences 用于管理侦听器。
标签: java api weak-references