例えば:
public void doSomething() {
final double MIN_INTEREST = 0.0;
// ...
}
個人的には、これらの置換定数がクラス レベルで静的に宣言されることを望みます。この問題について「業界の視点」を探していると思います。
複数のメソッドで使用される場合は、クラス レベルでのみ配置する必要があると思います。その方法でのみ使用される場合、それは私には問題ないようです。
私の出発点は、すべての変数または定数を、最初の使用にできるだけ近く/実用的に宣言/初期化する必要があるということです (つまり、コードの論理ブロックを半分に分割しないでください。数行近く宣言するだけです)。できるだけしっかりと。-- それが違うべき理由を私に教えてくれない限り。
たとえば、メソッド スコープの final はパブリック API では表示されません。場合によっては、この情報がクラスのユーザーにとって役に立たない場合があり、上に移動する必要があります。
質問で示した例では、MIN_INTEREST はおそらくユーザーが手に入れたい情報の 1 つであり、メソッドではなくクラスにスコープする必要があると言えます。(ただし、コード例にはコンテキストがなく、私の仮定は完全に間違っている可能性があります。)
技術的には、Java には「メソッド スコープの定数」のようなものはありません。あなたが参照しているのは、単に最終的なローカル変数です。メソッド呼び出しごとに作成され、破棄されます。
http://www.java-tips.org/java-se-tips/java.lang/how-do-i-declare-a-constant-in-java.html
私はこのメソッド スコープ定数を自分で使用しましたが、コード レビュー中に同僚が頻繁に mod をダウンさせます。繰り返しになりますが、これらの同僚はオープン ソースの読み書きには関心がありませんが、エンタープライズ ソフトウェアには慣れています。
単一のメソッド内で使用される場合、クラスレベルの定数を使用する意味がないことを彼らに伝えますが、それを上に移動することを主張する複数の同僚を見つけました。可読性やパフォーマンスに影響しない限り、私はそれほど厳格ではないので、通常は遵守します。
情報の隠蔽とモジュール性は重要な原則であり、狭い範囲はより優れた情報隠蔽です。定数がメソッドでのみ必要な場合は、隠蔽が適切です。定数が他の場所で役立つ場合は、より広いスコープに持ち出しますが、必要な範囲に限定してください。
これは定数であり、一部のグローバル プロパティ テーブルに属しているように見える可能性があるため、おそらく心配しているでしょう。たぶんそうです。たぶんそうではありません。あなたの懸念は有効ですが、すべての定数に最適な場所はありません。
クラス レベルまたはメソッド (ローカル) レベルで final 変数を定義できる理由は、(ローカル) メソッド内でグローバルな静的定数をオーバーライドできるためです。
例:
public class Test {
final double MIN_INTEREST = 0.0;
/**
* @param args
*/
public static void main(String[] args) {
Test test = new Test();
test.doSomethingLocal();
test.doSomethingGlobal();
}
public void doSomethingGlobal() {
System.out.println("Global-> " + MIN_INTEREST);
}
public void doSomethingLocal() {
final double MIN_INTEREST = 0.1;
System.out.println("Local-> " + MIN_INTEREST);
}
}
出力は次のようになります。
Local-> 0.1
Global-> 0.0
したがって、あなたの質問には意味がありません。