final
メソッドのパラメーターとローカル変数では、コードノイズと見なします。Javaメソッドの宣言は非常に長くなる可能性があります(特にジェネリックの場合)-もう宣言する必要はありません。
単体テストが適切に記述されている場合、「有害」なパラメータへの割り当てが選択されるため、実際に問題になることはありません。ユニットテストのカバレッジが不十分であるため、検出されない可能性のあるバグを回避するよりも、視覚的な明瞭さが重要です。
FindBugsやCheckStyleのようなツールは、パラメーターやローカル変数に割り当てが行われた場合にビルドを中断するように構成できます。そのようなことを深く気にかけている場合。
もちろん、たとえば匿名クラスで値を使用しているなどの理由で、それらを最終的にする必要がある場合は、問題ありません。これが最も簡単でクリーンなソリューションです。
パラメータに余分なキーワードを追加し、それによってそれらを偽装するという明らかな効果とは別に、メソッドパラメータにfinalを追加すると、メソッド本体のコードが読みにくくなり、コードが悪化します-「良い」コードできるだけ読みやすく、シンプルでなければなりません。不自然な例として、大文字と小文字を区別せずに動作させる必要があるメソッドがあるとします。
なしfinal
:
public void doSomething(String input) {
input = input.toLowerCase();
// do a few things with input
}
シンプル。掃除。誰もが何が起こっているかを知っています。
「最終」オプション1を使用します。
public void doSomething(final String input) {
final String lowercaseInput = input.toLowerCase();
// do a few things with lowercaseInput
}
パラメータを作ることながら、final
さらに下に、彼は元の値での作業の思考からのコードを追加することコーダを停止し、さらに下にそのコードを使用することができます等しい危険がありますinput
代わりにlowercaseInput
、それはやから保護することができないべきではない、「ので、あなたがすることができ、 tはスコープの外にそれを取る(あるいは割り当てるnull
にinput
それでもとにかく助けになる場合)。
「最終」オプション2の場合:
public void doSomething(final String input) {
// do a few things with input.toLowerCase()
}
これで、さらに多くのコードノイズが作成され、toLowerCase()
n回呼び出す必要があるというパフォーマンスヒットが発生しました。
「最終」、オプション3の場合:
public void doSomething(final String input) {
doSomethingPrivate(input.toLowerCase());
}
/** @throws IllegalArgumentException if input not all lower case */
private void doSomethingPrivate(final String input) {
if (!input.equals(input.toLowerCase())) {
throw new IllegalArgumentException("input not lowercase");
}
// do a few things with input
}
コードノイズについて話します。これは列車事故です。他のコードが誤って呼び出す可能性があるため、必要な例外ブロックという新しいメソッドがあります。例外をカバーするためのより多くの単体テスト。すべてが1つの単純な、そして私見が望ましい無害なラインを避けるために。
また、メソッドを視覚的に簡単に取り入れることができず、パラメーターへの割り当てが行われたことを一目で知ることができないほど、メソッドを長くすべきではないという問題もあります。
私はそれはあなたがそれを行うパラメータに割り当てた場合、好ましくは最初の行またはストレート基本的な入力チェックの後、この方法では、すべての初期のが効果的という良い習慣/スタイルだと思いますか交換のためにそれを全体の中に一貫性のある効果を持っている方法で、方法。読者は、割り当てが明白(署名宣言の近く)で一貫した場所にあることを期待していることを知っています。実際、パラメーターに割り当てることはめったにありませんが、そうする場合は常にメソッドの最上部で行います。
また、final
実際には保護されていないことに注意してください。
public void foo(final Date date) {
date.setTime(0);
// code that uses date
}
final
パラメータタイプがプリミティブまたは不変でない限り、完全に保護されません。