有一个房间道如下
@Dao public abstract class AccountDao { @Query("SELECT * FROM Account LIMIT 0,1") public abstract Account readAccount(); }
get()
和by lazy
以下样本之间有什么区别?
open val account: LiveDataget() = accountDao.readAccount()
open val account: LiveDataby lazy { accountDao.readAccount() }
Todd.. 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() } }
然后使用它:
fun main() { with(Foo()) { repeat(2) { println("Getter: $getterVal") println("Lazy: $lazyVal") } } }
对我来说,这打印:
Getter: 1288398235509938 Lazy: 1288398235835179 Getter: 1288398235900254 Lazy: 1288398235835179
我们可以看到,getter每次都返回一个新计算的值,而惰性版本则返回相同的缓存值。
不同之处在于函数主体(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() } }
然后使用它:
fun main() { with(Foo()) { repeat(2) { println("Getter: $getterVal") println("Lazy: $lazyVal") } } }
对我来说,这打印:
Getter: 1288398235509938 Lazy: 1288398235835179 Getter: 1288398235900254 Lazy: 1288398235835179
我们可以看到,getter每次都返回一个新计算的值,而惰性版本则返回相同的缓存值。