2012-05-21 2 views
26

可能性の重複:
When should one use final?可能であれば、変数「final」を宣言することはよい習慣ですか?

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

最終的な変数の不要な使用に関する一般的に受け入れられているベストプラクティスがあるかどうか、また、このディスカッションに気づかなければならない他のトレードオフや側面があるかどうかは疑問です。

+1

開発者の意図を表しているかもしれないし、そうでないかもしれないコンパイラの最適化につながるかもしれないオプションのコードの考え方は、XKCDコミックからのもののように聞こえる。 – jordanpg

+0

大きなことは、最終的な意味を非常に慎重にすることです。最終的に変更可能なオブジェクトは変更することができますが、一部の初心者は忘れてしまいます。これは私が最後に本当に持っている大きな問題です。変更可能なオブジェクトを使って作業しているときはいつでも、*最終的な目的は濁っています。私は文字通りの意味を知っていますが、最終的に使用している人は、それは最終的なものかどうか? – dsollen

答えて

0

PMDのようないくつかの優れた分析ツールは、必要な場合を除いて常にfinalを置くようにアドバイスします。そのツールのコンベンションでは、それは良い練習だと言います。

しかし、コード内の最終的なトークンの数が人間にとってやさしくなるかもしれません。

10

コンパイラよりもメンテナンスプログラマ(私を含む)のほうがいいと思います。どの変数が内部で変更されているか心配する必要がなければ、メソッドについて考えるのは簡単です。

+0

はい!それは本当に良い点です。この変数が変更されないことを即座に知ることで、可読性が向上します。それは考えるのが簡単になります。 –

+0

私は、これを少し誤解しているかもしれません。私の最初の怠惰な読書は、あなたがそれを守ることができないフィニアルとしては意味がない何かを変える方法について心配する必要がなかったので、既存の方法を使う方が簡単だと言っていたと思っていました。再読み込み時には、既存の方法を読み、それが何であるかを理解すると、それに割り当てられた最終結果を解析するのが簡単になるということを意味していると確信しています。しかし、私は初心者Javaの人々が元のやり方でそれを読んで、それが機能しないことを理解するにはあまりにも新しいかもしれないと恐れているだろう。 – dsollen

2

これは間違いなく、より良いコードを提供し、どの変数が変更されるのかを簡単に確認できます。

また、コンパイラーには最適化の結果が出る可能性があることが通知されます。

また、間違いがあるとIDEがコンパイル時の通知を与えることができます。

+0

私は同意しません。あなたはコレクションを最終として宣言することができますが、それでも内容を変更することができます...あなたが行うことができない唯一のことは、別のREFERENCEを割り当てることです!私は必要なときにフィールドのfinalを使うことに同意するが、ローカルのメソッド変数には???彼らの範囲は十分に制限されるべきです...それはちょうど私の意見です.. – Lawrence

0

あなたはかなり私はちょうど別の詐欺を追加することができます...

を長所と短所をまとめ:

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

はい、いいです。

そして、あなたがそれに慣れたあと、クラッタはそれほど悪くはありません(unixのように - P)。さらに、典型的なIDEは自動的にそれを行います。

12

"Javaのやり方"は本質的に、本質的に複雑です。

私はそれが良い方法だと言いますが、私はそれに従っていません。

テストでは、私が意図していることを一般的に確認しています。それはでも私の美学のためには不透明です。

+1

これは私がそれについてどのように感じるかを要約します。私は静的な文字列でのみfinalを使用します。 Javaはオブジェクトを値で渡すので(Cとは違って)、finalの使用は混乱を招くだけです。結局、あなたはあなたがやっていることを知っているか、していないかを知っている。私は決して最終的な使用によって防ぐことができたバグを持っていません...決して! – Lawrence

3

はい、オブジェクト構築時にどのフィールドを指定する必要があるかを明確に示しているので、とても良いアイデアです。

私は「コードクラッタ」を作成することに強く同意します。それは言語の優れた強力な側面です。

可能であれば、クラスが安全に公開されている可能性があるため、クラスをimmutable(最終フィールドすべて)にする必要があります。ただし、フィールド自体は不変オブジェクトである必要があります。

0

コンパイラの最適化ではなく、読みやすくするために、はいと言うでしょう。

しかし私は個人的に使っていません。 Javaはそれ自体が非常に冗長であり、 "良い実践"とみなされるすべてのものに従えば、コードはすべての定型文から信じられません。しかし、それは好みの問題です。

7

私は定期的に自分のコード内のローカル変数にfinalを適用し、最初のfinalキーワードを持つすべてのeffictively最終変数をマークした後、さらにはるかに簡単読んコードを見つけます。私はこれをコードの真正な強化とみなし、その後すぐにコミットします。

コードクラッタの懸念事項として、ローカル変数に適用すると、私はそれが損なわれないとわかりません—実際には、構文の色付けによってすべての宣言をより簡単に見つけることができます。

私はfinalが強化さ-用ループおよび他のすべての場所、狭い意味でのローカル変数以外のパラメータ、catchブロック、上で使用されているとき、私はそれがたまらなくcluttery見つけるかこと、しかし、認めなければなりません。これらのケースの再割り当てがさらに混乱し、実際にはデフォルトで最終的に行われているはずなので、これは非常に残念です。