gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:52:34 24 4
gpt4 key购买 nike

如果我使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com