ProgrammingAndroid開発者

Kotlinにおけるデフォルト引数と名前付き引数はどのように機能しますか?Javaとの違い、引数の渡し方、オーバーロードメソッドとのコンパイル、名前付き引数と位置引数の順序について説明してください。例を挙げてください。

Hintsage AIアシスタントで面接を突破

回答。

Kotlinはデフォルト値(default arguments)と名前付き引数(named parameters)をサポートしており、Javaに比べて大きな柔軟性を提供します。

主なポイント:

  • Kotlinでは、関数のパラメータにデフォルト値を持たせることができます:
    fun greet(name: String = "User", greeting: String = "Hello") { println("$greeting, $name!") }
  • 必要なパラメータのみを指定して関数を呼び出すことができ、残りはデフォルトで補完されます。
  • 名前付き引数を使用すると、引数の名前を明示的に指定でき、特に多くのパラメータがある関数の場合に便利です:
    greet(greeting = "こんにちは") // -> こんにちは, User!
  • 通常の(位置)パラメータと名前付きパラメータを組み合わせることができ、名前付きパラメータが呼び出しの途中で使用されない限り可能です。
  • Java(各組み合わせに対してオーバーロードを作成する)とは異なり、Kotlinはデフォルト引数をオーバーロードメソッドにコンパイルしますが、これはJavaとの相互運用性のためのみであり、Kotlin内部では視認できません。

ニュアンス:

  • 名前付き引数を使用した後は、次の引数も名前付きである必要があります。
  • Javaからデフォルトパラメータを持つ関数を使用するには、@JvmOverloadsアノテーションが必要な場合があります。

トリビアの質問。

Kotlinで関数を呼び出す際に、位置引数と名前付き引数を任意の順序で混ぜて使用できますか?

正しい回答: いいえ、一度でも名前付き引数を指定したら、すべての後続の引数も名前付きでなければなりません。違反するとコンパイルエラーが発生します。

// 誤り greet(greeting = "こんにちは", "イワン") // エラー! // 正しい greet("イワン", greeting = "こんにちは") greet(name = "イワン", greeting = "こんにちは")

知識の不足による実際のエラーの例。


ストーリー

チームはKotlinモジュールをレガシーJavaプロジェクトと統合し、デフォルトパラメータを持つ関数のために@JvmOverloadsアノテーションを追加し忘れました。その結果、Javaコードは必要なオーバーロードメソッドを認識せず、呼び出し時にランタイムエラーが発生しました。


ストーリー

名前付き引数を使用してリファクタリング中に、開発者が引数の位置を誤って入れ替えてしまいました。以降の引数名の変更を見逃し(型は浸透しないが、呼び出しの意味が変わってしまいました!)、UIのロジックに奇妙なバグが発生し、すぐには発見されませんでした。


ストーリー

開発者の一人が可読性を高めようとした際、途中で位置引数と名前付き引数を混ぜ合わせました。コードはコンパイルエラーとなりましたが、チームは問題を理解するのに苦労しました—他の言語でよく見かけるものだと思っていたため、Kotlinでも同様の動作を期待していました。