Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 了解var和val对属性的getter和setter的影响_Kotlin_Oop - Fatal编程技术网

Kotlin 了解var和val对属性的getter和setter的影响

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会起作用呢?其次,当

假设我有一个Kotlin类
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执行比隐藏或验证内部数据值更复杂的操作时