在Kotlin中选择属性初始值设定项和属性获取项的最佳实践是什么?

在Kotlin中选择属性初始值设定项和属性获取项的最佳实践是什么?,kotlin,Kotlin,在科特林,我们可以选择: class|object X { [override] val y = Z } 及 应该选择哪一个以及何时进行?根据您希望何时进行评估来决定。属性初始值设定项产生记忆语义:初始化表达式仅在实例化时计算: class X { val y = Z // Z evaluated only at instantiation time } 每次访问属性时,都会计算属性获取程序: class X { val y get() = Z // evaluated

在科特林,我们可以选择:

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


应该选择哪一个以及何时进行?

根据您希望何时进行评估来决定。属性初始值设定项产生记忆语义:初始化表达式仅在实例化时计算:

class X {
    val y = Z // Z evaluated only at instantiation time
}
每次访问属性时,都会计算属性获取程序:

class X { 
    val y get() = Z // evaluated on every access of y
}
有几个因素可能会让您选择其中一个:

  • 如果
    Z
    的计算值随时间变化,您可能希望每次都对其进行计算
  • 即使
    Z
    始终产生相同的结果,您也可能希望将评估推迟到首次访问。在这种情况下,可以使用
    lazy
    属性委托
  • 可能结果的大小很大,您不希望在不被积极使用的情况下将其保留在内存中。在这种情况下,我们更喜欢自定义getter

根据您希望何时进行评估来决定。属性初始值设定项产生记忆语义:初始化表达式仅在实例化时计算:

class X {
    val y = Z // Z evaluated only at instantiation time
}
每次访问属性时,都会计算属性获取程序:

class X { 
    val y get() = Z // evaluated on every access of y
}
有几个因素可能会让您选择其中一个:

  • 如果
    Z
    的计算值随时间变化,您可能希望每次都对其进行计算
  • 即使
    Z
    始终产生相同的结果,您也可能希望将评估推迟到首次访问。在这种情况下,可以使用
    lazy
    属性委托
  • 可能结果的大小很大,您不希望在不被积极使用的情况下将其保留在内存中。在这种情况下,我们更喜欢自定义getter

从答案中,我认为这是一条“经验法则”:1)如果Z发生变化,请使用getter。2) 如果X是一个类,则使用getter。3) 如果X是对象、枚举或伴随对象,则可以使用初始值设定项。这个解释正确吗?我的经验法则是主要使用初始值设定项,这是“通常”的方式。使用
get()
当你有特殊需要使用它时,我在答案中提到了其中一些。从答案中,我认为这是一条“经验法则”:1)如果Z发生变化,使用getter。2) 如果X是一个类,则使用getter。3) 如果X是对象、枚举或伴随对象,则可以使用初始值设定项。这个解释正确吗?我的经验法则是主要使用初始值设定项,这是“通常”的方式。使用
get()。