kotlin - ¿Cómo puedo forzar las llamadas a algunos constructores/funciones para que usen argumentos con nombre?
named-parameters (1)
Tengo algunos constructores y funciones que me gustaría que me llamen siempre con argumentos con nombre. ¿Hay una manera de requerir esto?
Me gustaría poder hacer esto para constructores y funciones con muchos parámetros y para aquellos que leen más claramente cuando se usan argumentos con nombre, etc.
He encontrado una manera de hacer esto en Kotlin 1.0 usando Nothing
de la stdlib:
/* requires passing all arguments by name */
fun f0(vararg nothings: Nothing, arg0: Int, arg1: Int, arg2: Int) {}
f0(arg0 = 0, arg1 = 1, arg2 = 2) // compiles with named arguments
//f0(0, 1, 2) // doesn''t compile without each required named argument
/* requires passing some arguments by name */
fun f1(arg0: Int, vararg nothings: Nothing, arg1: Int, arg2: Int) {}
f1(arg0 = 0, arg1 = 1, arg2 = 2) // compiles with named arguments
f1(0, arg1 = 1, arg2 = 2) // compiles without optional named argument
//f1(0, 1, arg2 = 2) // doesn''t compile without each required named argument
Como Array<Nothing>
es ilegal en Kotlin, un valor para vararg nothings: Nothing
se puede crear vararg nothings: Nothing
para pasarlo (supongo que sin la reflexión). Sin embargo, esto parece un poco pirateado y sospecho que hay una sobrecarga en el código de bytes para la matriz vacía del tipo Nothing
pero parece que funciona.
Este enfoque no funciona para los constructores primarios de clase de datos que no pueden usar vararg
pero se pueden marcar como constructores private
y secundarios con vararg nothings: Nothing
.
Este enfoque, sin embargo, no funciona en Kotlin 1.1: "Tipo de parámetro vararg prohibido: Nada". :-(
Afortunadamente, la esperanza no se pierde en Kotlin 1.1. Puede replicar este patrón definiendo su propia clase vacía con un constructor privado (como Nothing
), y usándolo como el primer parámetro de varargs. Por supuesto, esto no tendría que hacerse si los argumentos con nombre forzados fueran admitidos formalmente.