使用kotlin扩展为接口绑定一个属性

众所周知,java/kotlininterface 中是无法初始化(非静态)属性的。

那么我们是不是可以用扩展属性来为每个接口下的对象绑定一个独立的属性呢?

如果直接使用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()

val Foo.fieldSon: Son
    get() {
        val son = map[this]
        if (son == null) {
            map[this] = Son()
        }
        return map[this]!!
    }

但是这样会有内存泄露的问题,所以我们需要使用弱引用来代替hashMap

感觉这样实现还是挺麻烦的。

你可能感兴趣的:(使用kotlin扩展为接口绑定一个属性)