众所周知,java/kotlin
的 interface
中是无法初始化(非静态)属性的。
那么我们是不是可以用扩展属性来为每个接口下的对象绑定一个独立的属性呢?
如果直接使用val/var
的方式的话,其实这不是一个属性,而是一个方法。每次使用的时候都会产生一个新的对象
val Foo.fieldSon : Son
get() = {
return Son()
}
// log cat
Timber.d("Son val = ${fieldSon}")
Timber.d("Son val = ${fieldSon}")
(View.kt:14): Son val = Son@f422ce8
(View.kt:14): Son val = Son@c4bff01
用过lazy
小伙伴可能就会想到 用这样的方式来修改
val Foo.fieldSonLazy: Son by lazy {
Son()
}
// log cat
Timber.d("Son val = ${fieldSon}")
Timber.d("Son val = ${fieldSon}")
(View.kt:14): Son val = Son@fd411a6
(View.kt:14): Son val = Son@fd411a6
看起来是好了,但是这样其实是所有对象都使用了同一个静态对象,显然是不可行的。
所以我们可以改成这样
val map = hashMapOf<Foo, Son>()
val Foo.fieldSon: Son
get() {
val son = map[this]
if (son == null) {
map[this] = Son()
}
return map[this]!!
}
但是这样会有内存泄露的问题,所以我们需要使用弱引用来代替hashMap
。
感觉这样实现还是挺麻烦的。
网友评论