質問

例:

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

情報の隠蔽とモジュール性は重要な原則であり、狭い範囲は情報の隠蔽の向上です。定数がメソッドでのみ必要な場合、非表示は適切です。定数が他の場所で役立つ場合は、必要な範囲でのみ、より広い範囲に定数を引き出します。

これは定数であるため、おそらく懸念されます。したがって、グローバルプロパティテーブルに属しているように見える場合があります。たぶんそうです。たぶんそうではありません。あなたの懸念は有効ですが、すべての定数に最適な場所はありません。

私はこのメソッドのスコープを限定した定数を自分で使用しましたが、コードレビュー中に同僚が頻繁に定数を変更します。繰り返しますが、これらの同僚はオープンソースの読み取り/書き込みには興味がありませんが、エンタープライズソフトウェアに慣れています。

クラスレベルの定数を1つのメソッド内で使用する場合、クラスレベルの定数を使用しても意味がないと言いますが、1つ以上の同僚がそれを上に移動すると主張しています。 読みやすさやパフォーマンスに影響を与えない限り、私はそれほど厳格ではないので、通常は従います。

これについては別の見解があります。特に、この理由でチームで作業している場合は、ファイル/クラスのスコープに配置する方が良いと思います。小さなコードから始めます...

public void doSomething() {

  final double MIN_INTEREST = 0.0;

  // ...  
}

および他のチームのメンバーは、多数のメソッドでクラスを拡張し、クラスは素晴らしい 500行 / 50メソッドの巨大なクラスになりました。定数を使用して新しいメソッドを追加しようとしているエンジニアの経験を想像してください。彼らは、ニーズに一致する定数を探すためにクラス全体を 1 スキャンする必要があります 2 既存のコードと競合せず、 3 がメソッドを追加することを期待して、定数をクラススコープに移動します。

代わりにファイル/クラススコープですべての定数を追加する場合、エンジニアは既存の定数を検索する 1 の単一の場所を持ち、 2 からいくつかの定数を導出しますそれが理にかなっている他の人。 (たとえば、 pi の定数がある場合は、 pi / 2 の値で新しい定数を定義することもできます)。

クラスレベルまたはメソッド(ローカル)レベルで最終変数を定義できる理由は、(ローカル)メソッド内でグローバル静的定数をオーバーライドできるためです。

例:

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

だからあなたの質問は意味をなさない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top