Kotlinのデフォルト引数は、関数のシグネチャにデフォルトの値を直接指定することができ、コードをよりコンパクトで柔軟にします。この機能は可読性を向上させ、異なる数の引数を持つオーバーロードされたメソッドを作成する必要性を減らすことでメンテナンスを容易にします。
Javaでは、関数の異なる呼び出しオプションのために、しばしば複数のオーバーロードメソッドを書く必要があります。Kotlinでは、デフォルト値を宣言する簡潔な方法を作成し、APIを簡素化しました。
異なる呼び出しオプションのためのメソッドのオーバーロードは複雑で不便であり、冗長なコードと保守上の潜在的なエラーを引き起こします。
Kotlinでは、関数の定義でデフォルト引数を直接宣言できます。これは、JVMのバイトコードでの合成メソッドを介して実装されています(Javaから呼び出す場合)または通常の値のスキップを介して(Kotlinからの場合)。名前付き引数と組み合わせることで、関数呼び出しのインターフェースが非常に強力になります。
fun greet(name: String = "Guest", greeting: String = "Hello") { println("$greeting, $name!") } greet() // Hello, Guest! greet("Alice") // Hello, Alice! greet(greeting = "Hi") // Hi, Guest! greet("Bob", greeting = "Welcome") // Welcome, Bob!
インターフェース内の関数でデフォルト引数を使用できますか?
はい、ただしデフォルト値はKotlinからの呼び出しでのみ実装され、Javaからそのメソッドを呼び出すときには引数を明示的に指定する必要があります。
最初の(右でない)引数にデフォルト引数を指定できますか?それとも最後の引数にのみ可能ですか?
はい、Kotlinでは名前付き引数を使って呼び出す場合、特にこれが可能です。しかし、Javaから関数を使用するとき、Javaは名前付き引数をサポートしていないため、デフォルト引数は右からでなければなりません。
位置引数と名前付き引数を混在して使用する際の引数の順序はどのように機能しますか?
Kotlinでは、最初の名前付き引数の後は、すべての引数が名前付きでなければならず、さもなければコンパイルエラーが発生します。
greet("Ivan", greeting = "Zdrastvuyte") // OK greet(greeting = "Zdrastvuyte", "Ivan") // エラー:名前付き引数の後に位置引数を渡すことはできません
ロギングライブラリで、異なるロギングの組み合わせ(例外付き、タグ付き、なしなど)のために10のオーバーロードメソッドを実装しましたが、それを維持するのは不便です。
利点:
欠点:
デフォルト引数を持つ関数が使用されます:
fun log(msg: String, tag: String = "", throwable: Throwable? = null) { ... }
利点:
欠点: