Kotlinはデフォルト値(default arguments)と名前付き引数(named parameters)をサポートしており、Javaに比べて大きな柔軟性を提供します。
fun greet(name: String = "User", greeting: String = "Hello") { println("$greeting, $name!") }
greet(greeting = "こんにちは") // -> こんにちは, User!
@JvmOverloadsアノテーションが必要な場合があります。Kotlinで関数を呼び出す際に、位置引数と名前付き引数を任意の順序で混ぜて使用できますか?
正しい回答: いいえ、一度でも名前付き引数を指定したら、すべての後続の引数も名前付きでなければなりません。違反するとコンパイルエラーが発生します。
// 誤り greet(greeting = "こんにちは", "イワン") // エラー! // 正しい greet("イワン", greeting = "こんにちは") greet(name = "イワン", greeting = "こんにちは")
ストーリー
チームはKotlinモジュールをレガシーJavaプロジェクトと統合し、デフォルトパラメータを持つ関数のために
@JvmOverloadsアノテーションを追加し忘れました。その結果、Javaコードは必要なオーバーロードメソッドを認識せず、呼び出し時にランタイムエラーが発生しました。
ストーリー
名前付き引数を使用してリファクタリング中に、開発者が引数の位置を誤って入れ替えてしまいました。以降の引数名の変更を見逃し(型は浸透しないが、呼び出しの意味が変わってしまいました!)、UIのロジックに奇妙なバグが発生し、すぐには発見されませんでした。
ストーリー
開発者の一人が可読性を高めようとした際、途中で位置引数と名前付き引数を混ぜ合わせました。コードはコンパイルエラーとなりましたが、チームは問題を理解するのに苦労しました—他の言語でよく見かけるものだと思っていたため、Kotlinでも同様の動作を期待していました。