Kotlin 如何使用执行错误检查的自定义设置器初始化属性?
如何使用自定义setter初始化属性 例如,在我的setter中,我确保该值不是负值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 } } } 最后,我考虑了下面
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
}
}