Kotlin 如何使用执行错误检查的自定义设置器初始化属性?

Kotlin 如何使用执行错误检查的自定义设置器初始化属性?,kotlin,Kotlin,如何使用自定义setter初始化属性 例如,在我的setter中,我确保该值不是负值 class Foo(length: Int) { var length = length set(value) { if (value < 0) throw IllegalArgumentException("Can't be negative.") field = value } } } 最后,我考虑了下面

如何使用自定义setter初始化属性

例如,在我的setter中,我确保该值不是负值

class Foo(length: Int) {
    var length = length
        set(value) {
            if (value < 0) throw IllegalArgumentException("Can't be negative.")
            field = value
        }
    }
}
最后,我考虑了下面的代码,但这似乎是错误的,因为您在两个点中检查错误的值

class Foo(length: Int) {
    init {
        if (length < 0) throw IllegalArgumentException("Can't be negative.")
    }

    var length = length
        set(value) {
            if (value < 0) throw IllegalArgumentException("Can't be negative.")
            field = value
        }
    }
}
class Foo(长度:Int){
初始化{
如果(长度<0)抛出IllegalArgumentException(“不能为负”)
}
变量长度=长度
设置(值){
如果(值<0)抛出IllegalArgumentException(“不能为负”)
字段=值
}
}
}

您的第二个方法非常干净,尽管我会将初始值设置为某个常量,如0,而不是
长度。然后,如果您忘记在
init
块中指定
length
,则会收到编译器警告,提示构造函数参数未使用。

还有一种“第四种”方法(实际上是第二种方法的变体):

class-Foo{
var length=0//您甚至不能在此处指定长度
设置(值){
如果(值<0)抛出IllegalArgumentException(“不能为负”)
字段=值
}
//必须使用警告抑制是这种“第四种”方式的主要缺点
@抑制(“ConvertSecondaryConstructorToPrimary”)
构造函数(长度:Int){
this.length=长度
}
}
除了明确的警告抑制注释,在我看来,这种方式是最干净的,没有重复,而且样板最少

class Foo(length: Int) {
    init {
        if (length < 0) throw IllegalArgumentException("Can't be negative.")
    }

    var length = length
        set(value) {
            if (value < 0) throw IllegalArgumentException("Can't be negative.")
            field = value
        }
    }
}
class Foo {
    var length = 0 // You cannot even assign length here
        set(value) {
            if (value < 0) throw IllegalArgumentException("Can't be negative.")
            field = value
        }

    // Having to use a warning suppression is the primary drawback of this 'fourth' way
    @Suppress("ConvertSecondaryConstructorToPrimary")
    constructor(length: Int) {
        this.length = length
    }
}