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

Nik*_*vić 1 kotlin

在Kotlin,我们可以选择:

class|object X {
  [override] val y = Z
}
Run Code Online (Sandbox Code Playgroud)

class|object X {
  [override] val y: Y
    get() = Z
}
Run Code Online (Sandbox Code Playgroud)

应该选择哪一个?何时选择?

Mar*_*nik 5

根据您希望评估发生的时间来决定.属性初始化器导致memoization语义:初始化表达式仅在实例化时评估:

class X {
    val y = Z // Z evaluated only at instantiation time
}
Run Code Online (Sandbox Code Playgroud)

每次访问属性时都会评估属性getter:

class X { 
    val y get() = Z // evaluated on every access of y
}
Run Code Online (Sandbox Code Playgroud)

有几个因素可能会让您更喜欢其中一个:

  • 如果评估Z随时间的变化,您可能希望每次都进行评估.
  • 即使Z总是产生相同的结果,您也可能希望推迟评估,直到第一次访问.在这种情况下,您可以使用lazy属性委托.
  • 可能结果的大小很大,并且您不希望在未被主动使用的情况下将其保留在内存中.在这种情况下,更喜欢自定义的getter.