¿Cómo implementar un constructor de validation en Kotlin?

Estoy implementando vars en Kotlin que podrían recibir inputs fuera de límites de algunos de sus usuarios. Me gustaría poder invocar opcionalmente (solo en la input de estos usuarios no confiables) un constructor de validation que puede devolver nulo, y luego usar el operador de Elvis para especificar los valores pnetworkingeterminados en el caso de una input no válida, como en: var myFoo = Foo.fromInt(i) ?: 1 . Actualmente estoy usando un método de object complementario para validar la input:

 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 } 

Cuando clasifico a Foo , sé que tengo que volver a crear el object complementario. Intenté henetworkingar el compañero de una class abstracta; sin embargo, la llamada a Foo(x) aún apunta a Foo y no a Bar , a less que anule fromInt en el compañero de cada subclass. ¿Hay una mejor o más forma Kotlin-idomática para tratar este tipo de patrón de un constructor de validation que puede devolver null lugar de crear el object solicitado?

    podrías simplemente usar un solo constructor y siempre validar su argumento x y asignarlo a una propiedad como aquí:

     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) 

    Ahora llamando al constructor con un valor que no está dentro del range, se crea un Foo pnetworkingeterminado, que es básicamente lo que usted quería tener, creo. En mi opinión, sería mejor si lanzara una IllegalArgumentException lugar de crear un pnetworkingeterminado detrás de las escenas. ¿Qué piensas?