Home Articles

初始化具有getter和setter的字段?

Asked
Viewed 1647 times
1

我创建了一个在Kotlin中有一个示例字段的类

class SomeClass {
    var smth: String = "Initial value"
            get() = "Here it is"
            set(value) {
                field = "it is $value"
            }
}

当我创建类的对象并调用 smth 字段时,无论如何它将调用 get() 属性 .

val myValue = SomeClass().smth// myValue = "Here it is"

所以,问题是:为什么我们必须初始化一个有吸气剂的场?

var smth: String // Why this gives error?
        get() = "Here it is"
        set(value) {
            field = "it is $value"
        }

它总会从 get() 属性返回值,不是吗?

2 Answers

  • 3

    你在setter中有支持字段 field ,所以我们应该初始化,请参阅reference

  • 2

    我只是认为这是因为编译器不够聪明,无法推断出它不是null .

    实际上这是一个非常相似的代码来自官方文档https://kotlinlang.org/docs/reference/properties.html

    var stringRepresentation: String
        get() = this.toString()
        set(value) {
            setDataFromString(value) // parses the string and assigns values to other properties
        }
    

    显然这个代码不会编译,除非像构造函数那样

    constructor(stringRepresentation: String) {
        this.stringRepresentation = stringRepresentation
    }
    

    被添加 .

Related