跟踪已经看到的物体

时间:2012-09-17 14:19:25

标签: java object

我正在尝试为我的应用程序实现一个拦截器,它能够跟踪它看到的对象。我需要能够分辨出,我现在看到的对象是新的还是重用的。

假设我有一个像这样的界面:

public interface Interceptor {
    void process(Object o);
}

我一直在考虑添加一个可以跟踪这些对象的Set。但是既然我不想因这种行为导致内存泄漏,或许我应该设计一些其他模式?最后,这些对象可能会在其他层中被破坏。

可能的解决方案似乎:

  • 将对象的hashCode放入Set
  • 使用WeakHashSet而不是HashSet

第一个选项似乎不是100%可靠,因为hashCode可能不是唯一的。至于第二个选项,我不确定这会阻止memleaks。

还有一个注意,我无法修改对象,我无法添加字段,方法。包装也不是一种选择。

有什么想法吗?

2 个答案:

答案 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。