在Kotlin中选择属性初始化器和属性getter的最佳实践是什么?

时间:2018-05-23 04:16:20

标签: kotlin

在Kotlin,我们可以选择:

class|object X {
  [override] val y = Z
}

class|object X {
  [override] val y: Y
    get() = Z
}

应该选择哪一个?何时?

1 个答案:

答案 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属性委托。
  • 结果的大小可能很大,您不希望在未被主动使用的情况下将其保留在内存中。在这种情况下,更喜欢自定义吸气剂。