使用主要构造函数时的Kotlin getter / setter

时间:2020-06-12 06:01:35

标签: kotlin

该示例来自我正在做的科特林课程:

class Car {
    var speed: Int = 0
        get() = field 
        set(value) {
            field = value
        }
}

如果我想使用像这样的主要构造函数:

class Car(var speed: Int)

在这种情况下,我将如何编写getter / setter方法?

4 个答案:

答案 0 :(得分:5)

您可以使用构造函数中的值初始化属性:

class Car(speed: Int) {
    var speed: Int = speed
        get() = field
        set(value) {
            field = value
        }
}

答案 1 :(得分:2)

您不能在构造函数内部编写getter / setter,可以执行以下操作:

  1. 在类内部创建变量,其值取自构造函数。
class Car(speed: Int) {
    var speed = speed
        get() = field 
        set(value) {
            field = value
        }
}
  1. 使用@JvmField注释限制编译器不要自动生成getter / setter并自行实现
class Car(@JvmField private var speed: Int) {
    fun getSpeed() = speed
    fun setSpeed(value: Int) { speed = value }
}

答案 2 :(得分:2)

如果您的Car只是数据持有者,则可以将其设置为data class,这会为您生成许多方法,请参见以下示例:

data class Car(var speed: Int)

您可以按以下方式使用参数化的构造函数和setters

fun main() {
    // use a parameterized constructor
    var car = Car(240)
    println("${car.speed} km/h")

    // use the setter
    car.speed = 120
    println("${car.speed} km/h")
}

这将输出:

240 km/h
120 km/h

答案 3 :(得分:1)

财产的语法–

var <propertyName>[: <PropertyType>] [= <property_initializer>]
    [<getter>]
    [<setter>]

在这里,属性初始值设定项,getter和setter是可选的。如果可以从初始化程序中推断出属性类型,我们也可以省略它。 只读或不可变的属性声明的语法与可变的声明有两种不同: 以val而不是var开头,并且不允许使用setter。

在kotlin中,val仅用于读取方式的吸气剂,而var仅用于getter()setter()

class Company {
var name: String = "Defaultvalue"
}

上面的代码等同于下面的代码

class Company {
    var name: String = "defaultvalue"
        get() = field                     // getter
        set(value) { field = value }      // setter
}

如果您想在data class类中保存数据,也可以使用kotlin Car。因此,您无需定义getter和setter。

data class Car(var speed: Int)

有关更多信息,请检查https://kotlinlang.org/docs/reference/properties.html#getters-and-setters