美文网首页
使用kotlin扩展为接口绑定一个属性

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

作者: pdog18 | 来源:发表于2018-10-29 11:15 被阅读12次

众所周知,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<Foo, Son>()

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

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

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

相关文章

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

    众所周知,java/kotlin 的 interface 中是无法初始化(非静态)属性的。 那么我们是不是可以用扩...

  • Kotlin-面向对象-进阶

    扩展 扩展方法 Kotlin支持扩展方法和扩展属性。语法:被扩展的类/接口名.方法名() 父类不能使用子类的扩展方...

  • kotlin Reified 理解

    参考 Reified讲解 优缺点 代码理解 使用kotlin的扩展函数和扩展属性为Activity扩展出一个sta...

  • Kotlin扩展

    扩展函数 Kotlin中要扩展一个类的功能,除了使用继承(直接继承或继承一个接口使用委托)外,更便捷的方式是为该类...

  • kotlin语言学习10 ——kotlin 可见性与扩展

    本节主要介绍kotlin的可见性与kotlin中的扩展功能的使用,包括:扩展类、扩展方法、扩展伴生对象、扩展属性等...

  • Kotlin 扩展

    Kotlin 扩展Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator 模式。扩...

  • Kotlin-对Intent携参取值的扩展-(借鉴)

    目的: 主要是使用Kotlin扩展属性处理Intent中数据的取值 Kotlin的Property的读写扩展,下面...

  • 浅谈Kotlin语法篇之扩展函数(五)

    1、为什么要使用Kotlin中的扩展函数? 2、怎么去使用扩展函数和扩展属性? 3、什么是扩展函数和属性? 4、扩...

  • Kotlin 扩展

    原本地址:Kotlin 扩展 Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorato...

  • kotlin接口的定义和使用

    1、kotlin定义接口 kotlin使用关键字 interface 来定义接口接口可以有属性和函数两个元素组成。...

网友评论

      本文标题:使用kotlin扩展为接口绑定一个属性

      本文链接:https://www.haomeiwen.com/subject/efovtqtx.html