web-dev-qa-db-ja.com

可能な限り、変数を「最終」と宣言することをお勧めしますか?

重複の可能性:
いつfinalを使用する必要がありますか?

必要な場合を除いて、すべての変数をfinalと宣言する傾向があります。これは、コンパイラが識別子が期待どおりに使用されていることを確認できるため(たとえば、変更されていない)、これは良い習慣だと思います。一方、コードが乱雑になり、おそらくこれは「Java方法」」ではありません。

最終変数の不要な使用に関して一般的に受け入れられているベストプラクティスがあるかどうか、また、この議論に注意する必要のある他のトレードオフまたは側面があるかどうか疑問に思っています。

30
Landon Kuhn

「Javaの方法」は本質的に、本質的に雑然としています。

私はそれが良い習慣だと言いますが、私が従うものではありません。

テストは一般的に私が意図したことをしていることを確認します、そしてそれは私の美学にとってあまりにも雑然としています。

14
Dave Newton

コンパイラーよりもメンテナンスプログラマー(私を含む!)にとっては良い習慣だと思います。メソッド内でどの変数が変更されるかを心配する必要がない場合は、メソッドについて考える方が簡単です。

12
Carl Manaster

私は定期的にコード内のローカル変数にfinalを適用し、さらにすべての効率的に最終的な変数をfinalでマークした後、読み取りコードがはるかに簡単であることがわかります。キーワード。私はこれをコードの誠実な拡張と見なし、その後すぐにコミットします。

コードの乱雑さの懸念については、ローカル変数に適用しても損傷は見られません。実際、構文の色付けにより、すべての宣言をより簡単に見つけることができます。

ただし、finalをパラメーター、キャッチブロック、拡張forループ、および狭義のローカル変数を除く他のすべての場所で使用すると、doが耐えられないほど雑然としていることを認めなければなりません。これらの場合の再割り当てはさらに混乱を招き、デフォルトでは実際には最終的なものであるはずなので、これは非常に残念です。

10
Marko Topolnik

はい、オブジェクトの構築時にどのフィールドを提供する必要があるかが明確に示されているため、非常に良いアイデアです。

私はそれが「コードの乱雑さ」を生み出すことに強く反対します。それは言語の優れた強力な側面です。

設計原則として、クラスを安全に公開できる(つまり、破損することを恐れずに自由に渡される)可能性があるため、可能であればクラスを 不変 (すべての最終フィールド)にする必要があります。ただし、フィールド自体も不変オブジェクトである必要があることに注意してください。

5
Bohemian

それは間違いなくあなたにもっと良いコードを与え、どのすべての変数が変更されるのかを簡単に見ることができます。

また、変更されないことをコンパイラに通知します。これにより、最適化が向上する可能性があります。

それに加えて、間違いを犯しがちな場合に、IDEでコンパイル時の通知を受け取ることができます。

3
mprabhat

あなたはかなり賛否両論を要約しました...

私は別の短所を追加することができます:

コードの読者は、最終変数の値についてまったく推論する必要はありません(まれな不良コードの場合を除く)。

だから、はい、それは良い習慣です。

そして、あなたがそれに慣れた後、混乱はそれほど悪くはありません(unix :-Pのように)。さらに、一般的なIDEは自動的にそれを行います...

0
yair

はい、コンパイラの最適化ではなく、読みやすさのためにそう言います。

でも個人的には使っていません。 Javaはそれ自体が非常に冗長であり、「グッドプラクティス」と見なされるすべてに従うと、コードはすべての定型文から赤字化できなくなります。ただし、好みの問題です。

0
Jakub Zaverka

PMDのようないくつかの優れた分析ツールは、必要でない限り常にfinalを置くようにアドバイスします。したがって、そのツールの規則では、それは良い習慣だと言われています

しかし、コード内の最終的なトークンが多すぎると、人間にとって使い勝手が悪くなる可能性があると思います。

0
richarbernal