1. ホーム
  2. java

[解決済み] メソッドのパラメータやローカル変数にfinalを使用するのはどのような場合ですか?

2022-04-20 12:30:50

質問

いくつかの文献を見つけたのですが( 例えば を使用することを推奨しています。 final というのが気になるのですが、どうなんでしょう?これは主にメソッドのパラメータとローカル変数の文脈で、ファイナルメソッドやクラスではありません。定数については、明らかに意味があります。

一方では、コンパイラが最適化を行うことができ、プログラマの意図を明確にすることができます。一方では、冗長性が増し、最適化が些細なものになる可能性もある。

覚える努力をするものなのでしょうか?

どのように解決するのか?

こだわる。

  • 最終フィールド - フィールドを最終とマークすることで、構築の終了時に強制的に設定し、そのフィールドの参照を不変にします。 これにより、フィールドの安全な公開が可能になり、後の読み込み時の同期の必要性を回避することができる。 (オブジェクト参照では、フィールド参照だけが不変であることに注意してください。オブジェクト参照が参照するものはまだ変更可能で、それが不変性に影響します)。
  • 静的最終フィールド - 以前は静的最終フィールドを使っていた多くのケースで、今はenumを使っていますが。

検討するが、慎重に使用する。

  • 最終クラス - フレームワーク/API設計は、私が考慮する唯一のケースです。
  • 最終メソッド - 基本的には最終クラスと同じ。 もし、テンプレートメソッドパターンを狂ったように使い、finalをマークしているならば、おそらく継承に頼りすぎていて、委譲が十分でないのでしょう。

アナログな感じがしない限り、無視する。

  • メソッドのパラメータとローカル変数 - 私は怠惰なため、またコードが煩雑になるため、めったにこれを行いません。 修正するつもりのないパラメータとローカル変数をマークすることは、より正しいことだと思います。 デフォルトであればよかったのですが。 でも、そうでない場合、コードを理解するのが難しくなります。 他人のコードなら抜かないけど、新しいコードを書くなら入れない。 例外は、匿名の内部クラスからアクセスできるように、何かをfinalにする必要がある場合です。

  • 編集:最終ローカル変数が実際に非常に有用である1つのユースケースは、以下のように言及されていることに注意してください。 アダム・ゲント に値が代入される場合です。 if / else の枝になります。