【发布时间】:2013-03-27 04:26:05
【问题描述】:
我正在实现一些行为,这些行为有时可以从使用弱引用中受益。我希望班级的用户能够在施工时指出是否是这种情况。由于WeakReference 扩展Reference 乍一看似乎我可以做类似的事情(这是一个模型,而不是我真正想要做的事情):
public class Container<T> {
private boolean useWeakRef;
private Reference<T> ref;
public Container(boolean isWeak) {
useWeakRef = isWeak;
}
public void store(T val) {
if(useWeakRef) {
ref = new WeakReference<>(val);
} else {
ref = new StrongReference<>(val);
}
}
// May return null
public T get() {
return ref.get();
}
}
但是没有StrongReference类,根据Reference javadocs:
因为引用对象是与垃圾收集器密切配合实现的,所以这个类不能直接子类化。
所以我不能创建自己的 Reference 子类来保存对对象的强(即正常)引用。这似乎意味着不可能创建一个隐藏它是否使用来自调用者的弱(或软)引用的类。
我真的不明白为什么这个类不存在,StrongReference 对象应该总是从 get() 返回对象,除非已调用 clear()。为什么这个不见了? StrongReference 在某种程度上与 Reference 不一致吗?这将使构建通用引用持有者对象变得更加简单。
【问题讨论】:
-
如果你真的需要它,实现该功能的接口也很简单。
-
是的,我知道有一些变通方法,但我认为 Java 设计人员有意避免包含这个看似合乎逻辑的类,我想知道他们为什么这样做。
-
+1。还有 AtomicReference,它是一个强大且线程安全的引用,但它没有实现相同的接口。
-
我冒昧地认为你假设太多了 :-) 也许在 Oracle 将 Java 出售给关心的人之后的未来版本中。无论如何 +1 开发者的焦虑。
-
在我看来,“为什么设计师要采用 X 实现”的问题是完全有建设性的。例如,为什么 Guava 的weakKey MapMaker 对象使用
==而不是.equals()?答案是因为将.equals()与弱引用结合使用会有些不一致且容易出错,但他们的文档对此效果并不十分清楚。
标签: java memory-management reference