get()和lazy之间的区别

You*_* Qi 5 kotlin android-room android-livedata

有一个房间道如下

@Dao
public abstract class AccountDao {
    @Query("SELECT * FROM Account LIMIT 0,1")
    public abstract Account readAccount();
}
Run Code Online (Sandbox Code Playgroud)

get()by lazy以下样本之间有什么区别?

open val account: LiveData<Account>
        get() = accountDao.readAccount()
Run Code Online (Sandbox Code Playgroud)
open val account: LiveData<Account> by lazy { accountDao.readAccount() }
Run Code Online (Sandbox Code Playgroud)

Tod*_*odd 10

不同之处在于函数主体(accountDao.readAccount())将执行多少次。

lazy代表将执行拉姆达一次性第一次被访问和记忆的结果。如果再次调用,则返回该缓存的结果。

另一方面,定义getter(get())将每次执行函数主体,每次都返回一个新结果。

例如,假设我们有一个Foo同时具有getter和lazy值的类:

class Foo {
    val getterVal: String
        get() = System.nanoTime().toString()

    val lazyVal: String by lazy { System.nanoTime().toString() }
}
Run Code Online (Sandbox Code Playgroud)

然后使用它:

fun main() {
    with(Foo()) {
        repeat(2) {
            println("Getter: $getterVal")
            println("Lazy:   $lazyVal")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

对我来说,这打印:

Getter: 1288398235509938
Lazy:   1288398235835179
Getter: 1288398235900254
Lazy:   1288398235835179
Run Code Online (Sandbox Code Playgroud)

我们可以看到,getter每次都返回一个新计算的值,而惰性版本则返回相同的缓存值。