我正在尝试为我的应用程序实现一个拦截器,它能够跟踪它看到的对象。我需要能够分辨出,我现在看到的对象是新的还是重用的。
假设我有一个像这样的界面:
public interface Interceptor {
void process(Object o);
}
我一直在考虑添加一个可以跟踪这些对象的Set。但是既然我不想因这种行为导致内存泄漏,或许我应该设计一些其他模式?最后,这些对象可能会在其他层中被破坏。
可能的解决方案似乎:
第一个选项似乎不是100%可靠,因为hashCode可能不是唯一的。至于第二个选项,我不确定这会阻止memleaks。
还有一个注意,我无法修改对象,我无法添加字段,方法。包装也不是一种选择。
有什么想法吗?
答案 0 :(得分:5)
WeakReferences
是要走的路。来自here:
简单地说,弱引用是一个不够强大的引用 强制对象保留在内存中。弱引用允许您 利用垃圾收集器确定可达性的能力 你,所以你不必自己动手。
即。保持WeakReference
不会强制JVM保存对此对象的引用。
当然,弱参考不足以防止垃圾 集合,所以你可能会发现(如果没有强烈的引用 widget)weakWidget.get()突然开始返回null。
答案 1 :(得分:1)
刚刚完成对Brian Agnew的正确回答。 java API中没有WeakHashSet
类,您需要从WeakHashMap
创建它,如下所示:
Set<Object> weakHashSet = Collections.newSetFromMap(
new WeakHashMap<Object, Boolean>());
请参阅Collections.newSetFromMap java docs。