在 Kotlin 中有两种表达可选参数的方法,一种是指定默认参数值:
fun foo(parameter: Any, option: Boolean = false) { ... }
或者通过引入重载:
fun foo(parameter: Any) = foo(parameter, false)
fun foo(parameter: Any, option: Boolean) { ... }
在哪些情况下首选哪种方式?
这种功能的消费者有什么区别?
最佳答案
在 Kotlin 代码中调用其他 Kotlin 代码可选参数往往是使用重载的规范。使用可选参数应该是您的默认行为。
使用默认值的特殊情况:
foo()
如果 x
的值被省略,将默认一些值和 y
:而用函数重载做同样的事情会隐藏这些有用的信息,只会呈现出更加困惑的情况:
您可能不想使用默认参数值的情况:
@JvmOverloads
annotation哪一个:For every parameter with a default value, this will generate one additional overload, which has this parameter and all parameters to the right of it in the parameter list removed.
fun foo() = ...
并且您需要保留该函数签名,但您还想添加另一个具有相同签名但附加可选参数的函数:
fun foo() = ...
fun foo(x: Int = 5) = ... // never can be called using default value
您将无法在第二个版本中使用默认值(除了通过反射
callBy
)。取而代之的是所有 foo()
不带参数的调用仍然调用函数的第一个版本。所以你需要使用没有默认值的不同重载,否则你会混淆函数的用户:fun foo() = ...
fun foo(x: Int) = ...
不真正支持任何一种情况的情况:
如果您正在阅读其他语言中关于此的一般论点...
关于overloading - 默认参数与重载,何时使用哪个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39733830/