-1

そんなこと知ってる:

  • 空白の final クラス変数は、それが宣言されているクラスの静的初期化子によって確実に割り当てられる必要があります。そうしないと、コンパイル時エラーが発生します。

  • 空白の final インスタンス変数は、それが宣言されているクラスのすべてのコンストラクターの最後に確実に割り当てる必要があります。そうしないと、コンパイル時エラーが発生します。

宣言時だけでなく、いつでも一度だけ最終変数を割り当てることができないのはなぜですか?

4

3 に答える 3

2

final非変数の場合、これに対する当然の帰結は、変数の初期値です。すべてのフィールドは、そのタイプに応じて初期値を受け取ります。通常は、0またはのバリアントですnull

ここで、変数を であると宣言している場合final、特定の値を念頭に置いて、その変数を割り当てて、実行後に変更しないようにすることを意味します。Java はそれがどのような値であるかを認識していないため、開発者の意図を妨げないように、これらの値を自動的に宣言する利便性が失われる可能性があります。

それと、すべてのfinal変数を初期化する必要があるのは、すべての変数が使用前に確実に割り当てられるようにするためです。何らかの値に初期化していない非finalフィールドを使用できますが、おそらくそうなるでしょうがnull、同じ理由でまだ初期化していないローカル変数を使用することはできません。

于 2016-04-09T20:45:39.477 に答える
1

言語設計の決定は、常に柔軟性とエラー防止の間のトレードオフです。この場合、確認すべき簡単な質問がいくつかあります。

場合によっては、final変数が割り当てられていないコード パスがあります。

  • final開発者がデフォルト値 、nullまたは0を保持するためだけに変数を宣言する可能性はどれくらいありますかfalse?
  • 対照的に、開発者が初期化を忘れたり、可能なコード パスを見落としたりする可能性はどのくらいありますか?
  • デフォルト値が本当に必要な場合、開発者が明示的な代入を作成するのにどれだけの労力がかかるでしょうか?

これらの質問に答えようとすることが、この設計上の決定の背後にある論理的根拠につながるはずです。

これは、重要な説明を行う場所です。ローカル変数の場合、すべての変数は使用前に初期化する必要があります。finalこの制限は、非ヒープ変数、読み取り、フィールド、および配列要素に対してのみ解除されます。

配列の場合、最大 2³¹ 要素の長さで配列をインスタンス化できるのに、開発者が明示的なデフォルト値を書くことを強制されない理由は明らかです。非finalインスタンス フィールドの場合、この決定について議論することができます。しかし、そのような議論は Stackoverflow の範囲外です…</p>

于 2016-06-30T09:45:19.343 に答える