如何使用自定义setter检查参数的有效性?

我是Kotlin的新手,我无法围绕一个非常基本的问题:

我想有一个自定义的setter,并检查参数值是否有效(如果没有,抛出exception)。

我的代码:

class Test { var presni: Int = 1 set(value) { if (value < 0) { throw IllegalArgumentException("Negative value"); } presni = value } } 

但它在presni = value行给了我警告: 递归属性访问器

Kotlin中用于检查setter中的参数的有效性的成语是什么?

您必须使用Kotlin提供的自动支持字段 。 您可以使用field标识符访问它。

 class Test { var presni: Int = 1 set(value) { if (value < 0) { throw IllegalArgumentException("Negative value"); } // Assign the value to the backing field. field = value } } 

要在将值保存到后台字段之前validation值,还可以使用可调参数代理。

这是一个例子:

 var presni: Int by Delegates.vetoable(1,{ _, _, newValue -> newValue >= 0 }) 

官方文件说:

如果回调函数返回true ,则该属性的值将被设置为新值,如果回调函数返回false则新值将被丢弃,并且该属性将保持其旧值。