valとvarはどちらも変数を宣言するために使用されますが、根本的な違いがあります:
val number = 42 // number = 10 // エラー!
var counter = 0 counter++ // 許可されている
安全性とパフォーマンス:
valを使用することが推奨されます。これにより、偶発的な変更から保護され、コードの理解が容易になります。valを使用すると、コンパイラやIDEがコンパイル時にエラーを検出し、コードを最適化できます。
valとして宣言されたオブジェクトは変更できますか?
回答: 変数自体の値(参照)は再割り当てできませんが、リストなどのオブジェクトの場合、その内部状態は変更できます。
val list = mutableListOf(1,2) list.add(3) // 可能!しかし、list = 他のリストはエラーになります。
逸話
インターネットショップのプロジェクトで、開発者は商品リストを
val items = mutableListOf<Product>()として定義したため、リストが完全に不変であると考えていました。実際には、他の部分でリストが変更され(新しい要素が追加され)、カートの表示に予期しない影響を与えました。
逸話
大きなテキストファイルのパーサーで、配列バッファが
var bufferとして宣言されましたが、パース中にその内容を置き換える必要がありませんでした。偶然に新しい配列に再割り当てが発生し、メモリリークとデータ処理の誤りにつながりました。
逸話
あるマイクロサービスのコードで、ほとんどの変数が「念のため」に
varとして宣言されました。その結果、大きな式の中でオブジェクトの状態が異なるスレッドで変更され、レースコンディションによる捕らえにくいバグが発生しました。