2016-11-21 68 views
5

Kotlin有default arguments for function and constructor parameters。現在,我有一個函數如何在Kotlin中的函數之間傳播默認參數?

fun foo(bar: String = "ABC", baz: Int = 42) {} 

,我想從不同的地方調用它也保留不傳遞參數,轉而使用默認值的可能性。

我知道,我可以在調用函數

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) 
} 

但是現在foo我的默認參數是沒有意義的,因爲它總是自動覆蓋,我已經在所有的調用函數複製的默認參數聲明默認參數。這不是很乾。

有沒有更好的方法來傳播默認參數?

回答

1

回答我自己的問題,鼓勵the guidelines


你可以做什麼,是宣告在調用函數的參數可爲空,並使用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) 
} 

然後,使用elvis operator之一來使用默認值,當提供null時。

fun foo(bar: String? = null, baz: Int? = null) { 
    val realBar = bar ?: "ABC" 
    val realBaz = baz ?: 42 
} 

如果你正在處理的一類,而不是一個功能,你可以拉出的構造方法的屬性,並指定有默認值:

class Foo(bar: String? = null, baz: Int? = null) { 
    val bar = bar ?: "ABC" 
    val baz = baz ?: 42 
} 

或者,說如果你的類是一個data class,你想在主構造屬性,你可以聲明一個工廠方法來處理的默認值:相反,有三個樂趣

class Foo(val bar: String, baz: Int) { 
    companion object { 
     fun create(bar: String? = null, baz: Int? = null) = Foo(bar ?: "ABC", baz ?: 42) 
    } 
} 
+0

爲什麼downvote? –

2

ctions具有相同的默認參數:

fun foo(bar: String = "ABC", baz: Int = 42) 
fun foo2(bar: String = "ABC", baz: Int = 42) 
fun foo3(bar: String = "ABC", baz: Int = 42) 

不帶參數創建一個包裝類,它的參數,具備的功能:

class Foo(val bar: String = "ABC", val baz: Int = 42) { 

    fun foo() { /* ... */ } 

    fun foo2() { 
    // ... 
    foo() 
    } 

    fun foo3() { 
    // ... 
    foo() 
    } 
} 
0

如果您有多個功能以相同的參數(與相同的默認值),那麼這是一種代碼異味,表明這些參數是密切相關的,應該存在於自己的類中。

data class FooArgs(val bar: String = "ABC", val baz: Int = 42) 

fun foo(args: FooArgs = FooArgs()) { /* ... */} 

fun foo2(args: FooArgs = FooArgs()) { 
    ... 
    foo(args) 
} 

fun foo3(args: FooArgs = FooArgs()) { 
    ... 
    foo(args) 
} 

如果foo和/或foo2foo3只使用自己的論點,然後再重構將移動foofoo2FooArgs類,從而導致類似的解決方案,以the answer by @nhaarman