Как реализовать проверенный конструктор в Котлине?

Я внедряю vars в 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 в каждом компаньоне подкласса. Есть ли более или более котлин-идоматический способ справиться с таким типом шаблона валидирующего конструктора, который может возвращать 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 вместо создания по умолчанию за кулисами. Как вы думаете?