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

时间:2017-10-23 18:08:13

标签: kotlin

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

我想拥有一个自定义setter并检查参数值是否有效(如果没有则抛出异常)。

我的代码:

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

            presni = value
        }
}

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

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

2 个答案:

答案 0 :(得分:7)

您必须使用Kotlin提供的自动backing field。 您可以使用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
        }
}

答案 1 :(得分:7)

要在将值保存到支持字段之前验证值,您还可以使用Vetoable Delegate。

这是一个例子:

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

官方文件说:

  

如果回调返回true,则设置属性的值   到新值,如果回调返回false,则新值为   丢弃,财产仍然是旧的价值。