一、Java方式实现
var str = String("asdf")
val strSoftRef = SoftReference<String>(str)
str =
二、kotlin委托实现
委托属性,虽然常用by lazy,没看到别人的文章还想没想到这东西。
看lazy大致可以了解委托的实现方式,结合一些文章差不多可以写成这样
fun <T> weak(initializer: () -> T) = Weak(initializer.invoke())
class Weak<T>(r: T) {
private var reference: WeakReference<T?> = WeakReference(r)
operator fun getValue(thisRef: Any?, property: KProperty<*>): T? = reference.get()
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) {
this.reference = WeakReference(value)
}
}
可通过委托来实现
var str by weak { "str" }
软引用可以采用同样的写法。但是对于虚引用来说,虚引用一般配合引用队列一起使用,委托只能处理单一属性,所以就不用委托了。