如何在Kotlin中实现验证构造函数?

我正在Kotlin实施可能会接收某些用户的输入界限的变数。 我希望能够有选择地调用(只能来自这些不受信任的用户的输入)一个可以返回null的验证构造函数,然后使用Elvis运算符来指定在输入无效的情况下的默认值,如下所示: var myFoo = Foo.fromInt(i) ?: 1 。 我目前正在使用伴随对象方法来验证输入:

 open class Foo(val x:Int) { // relies on valid x in 1..3 companion object { fun fromInt(x: Int): Foo? = if (x in 1..3) Foo(x) else null } } class Bar(x:Int) : Foo(x) fun main(args:Array<String>) { println(Foo.fromInt(2)) // Foo(2) println(Foo.fromInt(20)) // null // println(Bar.fromInt(2)) // would like Bar(2) but as expected, companion isn't inherited } 

当我继承Foo ,我知道我必须重新创建伴侣对象。 我试过从抽象类继承同伴, 然而,对Foo(x)的调用仍然指向Foo而不是Bar ,除非我在每个子类的同伴中重写fromInt 。 有更好或更多的Kotlin-idomatic的方式来处理这种模式的验证构造函数,可以返回null而不是创建请求的对象?

你可以简单地使用一个构造函数,并且总是验证它的参数x并将它赋值给像这样的属性:

 open class Foo (x: Int) { // relies on valid x in 1..3 val x: Int = if (x in 1..3) x else 1 } class Bar(x: Int) : Foo(x) 

现在使用一个不在范围内的值调用构造函数,创建一个默认的Foo ,这基本上是你想要的。 在我看来,如果抛出一个IllegalArgumentException而不是在后台创建一个默认值会更好。 你怎么看?