2

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

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

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

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

可能的解决方案似乎:

  • 将对象的 hashCode 放入 Set
  • 使用 Wea​​kHashSet 而不是 HashSet

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

还有一点,我不能修改对象,不能添加字段、方法。包装也不是一种选择。

有任何想法吗?

4

2 回答 2

5

WeakReferences是要走的路。从这里

简而言之,弱引用是一种强度不足以强制对象保留在内存中的引用。弱引用允许您利用垃圾收集器为您确定可达性的能力,因此您不必自己做。

即保持 aWeakReference不会强制 JVM 保持对该对象的引用。

当然,弱引用的强度不足以防止垃圾回收,因此您可能会发现(如果没有对小部件的强引用)weakWidget.get() 突然开始返回 null。

于 2012-09-17T14:21:42.757 回答
1

只是对 Brian Agnew 正确答案的补充。java API中没有WeakHashSet类,你需要WeakHashMap像这样创建它:

Set<Object> weakHashSet = Collections.newSetFromMap(
        new WeakHashMap<Object, Boolean>());

请参阅Collections.newSetFromMap java 文档。

于 2012-09-17T14:42:31.903 回答