Programmingバックエンドデベロッパー

Kotlinにおける「val」と「var」のキーワードの違いは何ですか?コードの安全性とパフォーマンスの観点から、それらを最適に使用する方法は?

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

回答。

valvarはどちらも変数を宣言するために使用されますが、根本的な違いがあります:

  • val(value):不変で読み取り専用の参照を宣言します。初期化後、値を再割り当てすることはできず、参照は常に1つのオブジェクトに留まります:
val number = 42 // number = 10 // エラー!
  • var(variable):可変変数を宣言します;
var counter = 0 counter++ // 許可されている

安全性とパフォーマンス:

  • 変数が変更されるべきでない場合は、どこでもvalを使用することが推奨されます。これにより、偶発的な変更から保護され、コードの理解が容易になります。
  • valを使用すると、コンパイラやIDEがコンパイル時にエラーを検出し、コードを最適化できます。

ひっかけ問題。

valとして宣言されたオブジェクトは変更できますか?

回答: 変数自体の値(参照)は再割り当てできませんが、リストなどのオブジェクトの場合、その内部状態は変更できます。

val list = mutableListOf(1,2) list.add(3) // 可能!しかし、list = 他のリストはエラーになります。

このテーマの微妙な点を知らないことでの実際のエラーの例。


逸話

インターネットショップのプロジェクトで、開発者は商品リストをval items = mutableListOf<Product>()として定義したため、リストが完全に不変であると考えていました。実際には、他の部分でリストが変更され(新しい要素が追加され)、カートの表示に予期しない影響を与えました。


逸話

大きなテキストファイルのパーサーで、配列バッファがvar bufferとして宣言されましたが、パース中にその内容を置き換える必要がありませんでした。偶然に新しい配列に再割り当てが発生し、メモリリークとデータ処理の誤りにつながりました。


逸話

あるマイクロサービスのコードで、ほとんどの変数が「念のため」にvarとして宣言されました。その結果、大きな式の中でオブジェクトの状態が異なるスレッドで変更され、レースコンディションによる捕らえにくいバグが発生しました。