我正在寻找类似于java.lang.ref.WeakReference
的弱引用实现,但它提供了set()
方法或其他一些重新引用创建的弱引用对象的方法。这是一个例子:
MutableWeakReference ref = new MutableWeakReference(someObject);
ref.set(anotherObject);
我需要这样做以避免对象创建,在我的情况下,执行时间会减慢一个数量级,因为我不断更改弱引用引用的对象。
我尝试从JDK复制代码,但似乎不可能,因为java.lang.ref.Reference
使用内部的sun.misc.Cleaner
类。我也看了Android的实现,但它似乎依赖于Dalvik VM的垃圾收集。我想知道这是否可以在不改变JVM /环境的情况下实现。
答案 0 :(得分:3)
是不是可以将您的引用封装在一个简单的
中class MyOwnReference<T> {
public T ref;
public void set(T o) { ref = o; }
}
并创建WeakReference<MyOwnReference<WhatEver>>
?
我想知道这是否真的可以在不改变JVM /环境的情况下实现。
不,你可能无法“重新实现”WeakReference
。它是JVM支持的类。
您确定WeakReference
个实例的创建会降低它的速度吗?我不认为这样做
ref = new WeakReference(someObject);
而不是一些
ref.set(anotherObject);
会贵得多。
答案 1 :(得分:3)
我实际上正在实现某种迭代器。每当我前进到下一个条目时,我都需要创建一个新的
WeakReference
。
我很困惑为什么你需要在迭代器中使用WeakReference
。 WeakReference
的正常用例是对对象的长期引用。但迭代器通常是一个短期对象,迭代通常是一个短期过程。它/他们在短期内使用普通(强)引用目标对象的事实不应该是一个问题。
我已经进行了一些测试,看起来好像是慢了8-10倍。
同样,这表明您根本不应该使用WeakReference
。
为什么常规参考不适合您,是否有特殊原因?
答案 2 :(得分:0)
您无法自行编写弱引用。它是JVM专门处理的“特殊”类。
只需使用新的弱引用
class MutableWeakReference<T>
WeakReference<T> wr;
void set(T obj)
wr = new WeakReference(obj);