9

なぜ人々はクラス内のすべての変数を「最終」にすることにそれほど重点を置いているのですか?プライベートローカル変数にfinalを追加したり、定数以外の目的でfinalを使用したり、変数を匿名の内部クラスに渡したりすることに真のメリットがあるとは思いません。

私はどんな種類の炎上戦争も始めるつもりはありません、私は正直に言って、これが何人かの人々にとってとても重要である理由を知りたいです。私は何かが足りないのですか?

4

8 に答える 8

14
  1. 意図。コードを変更する他の人は、変更するはずのない値を変更しません。

  2. フィールドの値が変更されないことがコンパイラーにわかっている場合は、コンパイラーの最適化を行うことができます。

また、クラス内のすべての変数が(投稿で参照しているように)finalである場合、スレッドセーフを実現するための優れた方法である不変のクラスがあります(可変プロパティへの参照を公開しない限り)。 。

于 2010-02-10T05:32:08.273 に答える
11

欠点は、それです

annoy it is hard
annoy to read
annoy code or anything
annoy else when it all 
annoy starts in the 
annoy same way

定数を作成し、サブクラス化/オーバーライドを防ぐための明白な使用法を除いて、多くの場合、「プログラマーの意図を示す」ことの利点は実際のコードの可読性よりも重要であると多くの人が信じているため、これは個人的な好みです。多くの人は、少し冗長性を低くすることを好みます。

最適化に関しては、それはそれを使用する理由としては不十分です(多くの場合意味がありません)。これはマイクロ最適化の最悪の形式であり、JITの時代には目的を果たしません。

私はあなたが好むならそれを使うことを提案します、あなたがそれがあなたが好むものであるならばそうではありません。多くの場合、それはすべて宗教的な議論に帰着するので、心配しないでください。

于 2010-02-10T19:19:55.377 に答える
4

これは、その値が変更されることを期待していないことを示しています。これは無料のドキュメントです。これは、その変数の意図を明確に伝え、コンパイラーにそれを検証させるためです。それを超えて、それはコンパイラが最適化を行うことを可能にします。

于 2010-02-10T05:31:23.977 に答える
3

特に共有メモリモデルを扱う場合は不変性が重要であるため、これは重要です。何かが不変である場合、それはスレッドセーフであり、ベストプラクティスとして従うのに十分な議論になります。

http://www.artima.com/intv/blochP.html

于 2010-02-10T05:34:18.707 に答える
3

まだ言及されていない並行プログラミングの1つの利点:

最終フィールドは、コンストラクターの実行が完了したときに初期化されることが保証されています。

于 2010-02-10T10:27:08.577 に答える
2

私が現在取り組んでいるプロジェクトは、Eclipseで「保存」を押すたびfinalに、コードで変更されていないすべての変数またはフィールドに修飾子が追加されるように設定されています。そして、それはまだ誰も傷つけていません。

于 2010-02-10T06:07:36.173 に答える
1

他の場所で述べたように、finalを使用する理由はたくさんあります。それが価値のない1つの場所、IMOは、メソッドのパラメーターです。厳密に言えば、キーワードはここに価値を追加しますが、その値は醜い構文に耐えるのに十分な高さではありません。そのような情報を単体テストで表現したいと思います。

于 2010-02-10T15:12:10.110 に答える
0

クラスがおそらく継承されない限り、クラスの内部にあるfinalover値の使用はやり過ぎだと思います。唯一の利点は、コンパイラの最適化に関するものであり、これは確かにメリットがあります。

于 2010-02-10T05:33:36.407 に答える