Java では、なぜプリミティブ型を含むローカル変数は常に初期化する必要があるのでしょうか? インスタンス変数の場合は同じことが当てはまらないのはなぜですか?
ベストアンサー1
基本的に、変数を読み取る前に値を割り当てる必要があるのは良いことです。つまり、意図しないものを誤って読み取ってしまうことがなくなります。確かに、変数にはデフォルト値を設定できますが、まだ割り当てられていない可能性のあるものを読み取ろうとしていることが証明できれば、コンパイラがバグを検出できる方がよいのではないでしょうか。ローカル変数にデフォルト値を設定する場合は、常に明示的に割り当てることができます。
ローカル変数の場合は問題ありませんが、インスタンス変数や静的変数の場合は、コンパイラはメソッドが呼び出される順序を知る方法がありません。プロパティの「setter」は「getter」よりも先に呼び出されるでしょうか? 知る方法がないので、危険を警告する方法がありません。そのため、デフォルト値がはインスタンス/静的変数に使用されます - 少なくとも、その時点でメモリにあった値ではなく、既知の値 (0、false、null など) が取得されます。(明示的に消去されていない機密データを読み取るという潜在的なセキュリティ問題も排除されます。)
ありました最近C#について質問です... - 基本的には同じことなので、そちらの回答も読んでみてください。エリック・リッパートの最近のブログ投稿興味深いですね。推力は多少異なりますが、少なくともほぼ同じエリアです。