如何强制调用某些构造函数/函数来使用命名参数?

时间:2016-05-23 14:54:25

标签: kotlin named-parameters

我有一些构造函数和函数,我希望始终使用命名参数调用它们。有没有办法要求这个?

我希望能够为具有许多参数的构造函数和函数执行此操作,并且对于那些在使用命名参数时更清楚地读取的函数,等等。

1 个答案:

答案 0 :(得分:18)

通过使用stdlib中的Nothing,我找到了在Kotlin 1.0中执行此操作的方法:

/* 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

由于Array<Nothing>在Kotlin中是非法的,因此无法创建vararg nothings: Nothing的值以传入(我认为没有反映)。这看起来有点像黑客,我怀疑类型为Nothing的空数组的字节码有一些开销,但似乎有效。

此方法不适用于无法使用vararg的数据类主构造函数,但这些构造函数可以标记为private,辅助构造函数可以与vararg nothings: Nothing一起使用。

然而,这种方法在Kotlin 1.1中不起作用:&#34; Forbidden vararg参数类型:Nothing&#34;。 :-(

谢天谢地,希望在Kotlin 1.1中不会丢失。您可以通过使用私有构造函数(如Nothing)定义自己的空类来复制此模式,并将其用作第一个varargs参数。当然,如果正式支持强制命名参数,则不必这样做。