在Kotlin,我们可以选择:
class|object X {
[override] val y = Z
}
和
class|object X {
[override] val y: Y
get() = Z
}
应该选择哪一个?何时?
答案 0 :(得分:5)
根据您希望评估发生的时间来决定。属性初始化器导致memoization语义:初始化表达式仅在实例化时评估:
class X {
val y = Z // Z evaluated only at instantiation time
}
每次访问该属性时都会评估属性getter:
class X {
val y get() = Z // evaluated on every access of y
}
有几个因素可能会让您更喜欢其中一个:
Z
的评估随着时间的推移而发生变化,您可能希望每次都对其进行评估。Z
总是产生相同的结果,您也可能希望推迟评估,直到第一次访问。在这种情况下,您可以使用lazy
属性委托。