Kotlin 了解var和val对属性的getter和setter的影响
假设我有一个Kotlin类Kotlin 了解var和val对属性的getter和setter的影响,kotlin,oop,Kotlin,Oop,假设我有一个Kotlin类Dog,它有两个属性weight和weightInKgs class Dog(val weight: Double) { // property without initializing works. Why? val weightinKgs: Double get() = weight/ 2.2; } 上面的代码运行时没有错误。我知道Kotlin中的每个属性都必须初始化,那么为什么在不初始化属性的情况下定义getter会起作用呢?其次,当
Dog
,它有两个属性weight
和weightInKgs
class Dog(val weight: Double) {
// property without initializing works. Why?
val weightinKgs: Double
get() = weight/ 2.2;
}
上面的代码运行时没有错误。我知道Kotlin中的每个属性都必须初始化,那么为什么在不初始化属性的情况下定义getter会起作用呢?其次,当weightInKgs
的val
更改为var
时,它会产生一个请求初始化的错误。将其更改为var
会如何破坏代码
class Dog(val weight: Double) {
// well its doesn't work now.
var weightinKgs: Double
get() = weight/ 2.2;
}
必须初始化每个具有支持字段的属性。如果您定义了一个不使用支持字段的自定义getter,并且没有在声明站点使用=
为支持字段赋值,那么它就没有一个值,因此没有任何要初始化的内容
如果将属性定义为var
,而没有定义不使用支持字段的自定义设置器,则它再次具有一个必须初始化的支持字段(因为隐式设置器使用一个)。每个具有支持字段的属性都必须初始化。如果您定义了一个不使用支持字段的自定义getter,并且没有在声明站点使用=
为支持字段赋值,那么它就没有一个值,因此没有任何要初始化的内容
如果将属性定义为
var
,而没有定义不使用支持字段的自定义setter,则它再次具有一个必须初始化的支持字段(因为隐式setter使用一个)。如果不明显,get()
是一个计算值的函数(weight/2.2
)每次你叫它。这基本上相当于这个
fun getWeightInKgs(): Double {
return weight / 2.2
}
这就是为什么它没有备份字段,它实际上没有存储值。但是Kotlin将这些类型的getX()
函数(以及set
,is
等)作为属性,并鼓励您使用属性访问语法,因此dog.weightInKgs
而不是dog.getWeightInKgs()
。有点隐藏了具体的实现细节
如果你不想每次都计算重量,只想做一次,那么你只需要做一次
val weightInKgs = weight / 2.2
然后它会有一个支持字段,因为该值必须存储在某个地方。您还可以有一个getter函数,该函数引用私有
val
或var
,并返回该函数的值,而不是,但是如果您需要这样做,您可能会理解为什么要这样做!这通常适用于getter和/或setter所做的事情比仅仅隐藏或验证内部数据值要复杂一些的时候,如果它不明显,get()
是一个函数,每次调用它时都会计算一个值(weight/2.2
)。这基本上相当于这个
fun getWeightInKgs(): Double {
return weight / 2.2
}
这就是为什么它没有备份字段,它实际上没有存储值。但是Kotlin将这些类型的getX()
函数(以及set
,is
等)作为属性,并鼓励您使用属性访问语法,因此dog.weightInKgs
而不是dog.getWeightInKgs()
。有点隐藏了具体的实现细节
如果你不想每次都计算重量,只想做一次,那么你只需要做一次
val weightInKgs = weight / 2.2
然后它会有一个支持字段,因为该值必须存储在某个地方。您还可以有一个getter函数,该函数引用私有val
或var
,并返回该函数的值,而不是,但是如果您需要这样做,您可能会理解为什么要这样做!这通常适用于getter和/或setter执行比隐藏或验证内部数据值更复杂的操作时