Kotlin具有函数和构造函数参数的默认参数.现在,我有一个功能
fun foo(bar: String = "ABC", baz: Int = 42) {}
Run Code Online (Sandbox Code Playgroud)
我想从不同的地方调用它,但也保留不传递参数的可能性,而是使用默认值.
我知道,我可以在调用函数中声明默认参数
fun foo2(bar: String = "ABC", baz: Int = 42) {
// do stuff
foo(bar, baz)
}
fun foo3(bar: String = "ABC", baz: Int = 42) {
// do other stuff
foo(bar, baz)
}
Run Code Online (Sandbox Code Playgroud)
但现在我的默认参数foo是无意义的,因为它总是被覆盖,我已经复制了所有调用函数中的默认参数.那不是很干.
有没有更好的方法来传播默认参数?
按照指南的鼓励回答我自己的问题。
您可以做的是将调用函数中的参数声明为可为空并用作null默认参数:
fun foo2(bar: String? = null: Int? = null) {
// do stuff
foo(bar, baz)
}
fun foo3(bar: String? = null, baz: Int? = null) {
// do other stuff
foo(bar, baz)
}
Run Code Online (Sandbox Code Playgroud)
然后,使用elvis 运算符之一来使用默认值(如果null提供)。
fun foo(bar: String? = null, baz: Int? = null) {
val realBar = bar ?: "ABC"
val realBaz = baz ?: 42
}
Run Code Online (Sandbox Code Playgroud)
如果您正在处理类而不是函数,则可以提取构造函数的属性并在那里分配默认值:
class Foo(bar: String? = null, baz: Int? = null) {
val bar = bar ?: "ABC"
val baz = baz ?: 42
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您的类是 adata class并且您希望在主构造函数中拥有属性,则可以声明一个工厂方法来处理默认值:
class Foo(val bar: String, baz: Int) {
companion object {
fun create(bar: String? = null, baz: Int? = null) = Foo(bar ?: "ABC", baz ?: 42)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
244 次 |
| 最近记录: |