WeakLazy for Kotlin


#1

WeakLazy

WeakLazy for Kotlin.

作为 Kotliner 大家应该都知道下面代码意义:

//这是一个懒初始化的变量
val value by lazy { //initializer }

但这个lazy存在一个问题:初始化后就无法自动回收,除非引用它的对象被回收。

想象一下:我们偶尔会弄一个全局懒初始化变量,这样都会一直保留在内存中。且无法手动 value = null。更多的是希望在不久后能够被系统收回内存,因此有了WeakLazy。

优点

  1. 懒初始化
  2. 在连续获取值时,不会频繁调用初始化块
  3. 在程序gc后能及时释放内存

适用于内存占用较大,不频繁使用的变量。

演示

val finalWeakLazyDelegate = weakLazy {
    listOf(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
}

val finalValue by finalWeakLazyDelegate

fun main() {
    println("hasValue: " + finalWeakLazyDelegate.hasValue)
    println(finalValue)
    println("hasValue: " + finalWeakLazyDelegate.hasValue)

    System.gc()    //or  finalWeakLazyDelegate.clearWeakValue()
    println("hasValue: " + finalWeakLazyDelegate.hasValue)
}

output:

hasValue: false
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
hasValue: true
hasValue: false

顺便说一下:weakLazy 初始化代码块可能多次执行,可以按需求来确定返回的值。
同时,不要存入需要手动释放的资源,比如 Closeable

源码:WeakLazy.kt


#2

学习了;你好,这是看书习得,还是紧跟官网版本更新后,潇洒 自由 探索习得,好奇一下:-)


#3

哈哈 就是根据实际需要总结出来的


#4

这种情况不如直接定义个函数。。


#5

这样的变量多了 都手写函数?


#6

weaklazy这个吧,每次获取的结果可能一样又可能不一样,不太明确,感觉就是在 lazy 和函数(或者只实现了getter的属性)的中间态。

如果是为了延迟计算,那可能计算成本很高,释放了之后还是得重新计算,不能解决成本问题,还让内存管理显得不那么直接,因为可能会被共享对象,不如lazy。

当然,如果不存在共享,似乎就更没这样搞的意义了。但多数情况下共享本身就很危险,不应该被提倡。

如果只是为了方便内存释放,定义一个函数,局部使用的时候调用一次就行,也没必要搞得这么复杂。

我感觉你可能觉得定义函数比定义属性写起来更麻烦,但其实并没有。只定义了getter的属性写起来也不麻烦。

当然,你可能有能比较好的说明问题的具体的使用场景,可以拿出来讨论下。


京ICP备16022265号-2 Kotlin China 2017 - 2018