【发布时间】:2016-07-20 10:02:05
【问题描述】:
我的情况是,我有一个缓存一些引用的静态列表。由于这是一个静态列表,我想使用 WeakReference,这样我就不会无用地将对象保存在内存中。
问题 - 我认为 - 我有一个引用是匿名类。我担心如果我将匿名类存储为 WeakReference,它可能会很快被收集,如果我将匿名类存储为强引用,它将持有对构造匿名类的类的引用。
不知道我的解释是否清楚,所以这里是一段代码:
public interface Callback {
void call();
}
public class A {
public void doIt() {
B.register(this, new Callback() {
public void call() {
// do something
}
});
}
}
public class B {
private static final List<Item> ITEMS = new LinkedList<>();
public static void register(Object key, Callback callback) {
Item item = new Item();
item.key = new WeakReference<>(key);
// ??
item.callback = new WeakReference<>(callback);
ITEMS.add(item);
}
private static class Item {
private WeakReference<Object> key;
private WeakReference<Callback> callback;
}
}
基本上,如果在 Item 'callback' 中是一个弱引用,它可能在我有机会使用它之前就被垃圾收集了。 如果在 Item 'callback' 中是一个标准引用,'A' 的实例将永远不会被垃圾回收。
所以我的第一个问题:我的理解正确吗? 第二个问题:有没有办法让它工作还是我必须改变设计?
谢谢。
【问题讨论】:
标签: java garbage-collection weak-references