そんなこと知ってる:
空白の final クラス変数は、それが宣言されているクラスの静的初期化子によって確実に割り当てられる必要があります。そうしないと、コンパイル時エラーが発生します。
空白の final インスタンス変数は、それが宣言されているクラスのすべてのコンストラクターの最後に確実に割り当てる必要があります。そうしないと、コンパイル時エラーが発生します。
宣言時だけでなく、いつでも一度だけ最終変数を割り当てることができないのはなぜですか?
そんなこと知ってる:
空白の final クラス変数は、それが宣言されているクラスの静的初期化子によって確実に割り当てられる必要があります。そうしないと、コンパイル時エラーが発生します。
空白の final インスタンス変数は、それが宣言されているクラスのすべてのコンストラクターの最後に確実に割り当てる必要があります。そうしないと、コンパイル時エラーが発生します。
宣言時だけでなく、いつでも一度だけ最終変数を割り当てることができないのはなぜですか?
final
非変数の場合、これに対する当然の帰結は、変数の初期値です。すべてのフィールドは、そのタイプに応じて初期値を受け取ります。通常は、0
またはのバリアントですnull
。
ここで、変数を であると宣言している場合final
、特定の値を念頭に置いて、その変数を割り当てて、実行後に変更しないようにすることを意味します。Java はそれがどのような値であるかを認識していないため、開発者の意図を妨げないように、これらの値を自動的に宣言する利便性が失われる可能性があります。
それと、すべてのfinal
変数を初期化する必要があるのは、すべての変数が使用前に確実に割り当てられるようにするためです。何らかの値に初期化していない非final
フィールドを使用できますが、おそらくそうなるでしょうがnull
、同じ理由でまだ初期化していないローカル変数を使用することはできません。
言語設計の決定は、常に柔軟性とエラー防止の間のトレードオフです。この場合、確認すべき簡単な質問がいくつかあります。
場合によっては、final
変数が割り当てられていないコード パスがあります。
final
開発者がデフォルト値 、null
または0
を保持するためだけに変数を宣言する可能性はどれくらいありますかfalse
?これらの質問に答えようとすることが、この設計上の決定の背後にある論理的根拠につながるはずです。
これは、重要な説明を行う場所です。ローカル変数の場合、すべての変数は使用前に初期化する必要があります。final
この制限は、非ヒープ変数、読み取り、フィールド、および配列要素に対してのみ解除されます。
配列の場合、最大 2³¹ 要素の長さで配列をインスタンス化できるのに、開発者が明示的なデフォルト値を書くことを強制されない理由は明らかです。非final
インスタンス フィールドの場合、この決定について議論することができます。しかし、そのような議論は Stackoverflow の範囲外です…</p>