57

Java では、より良いカプセル化を可能にするために変数を非公開にする必要があると教えられていますが、静的定数はどうでしょうか? これ:

public static final int FOO = 5;

結果としてこれと同等になります:

private static final int FOO = 5;
...
public static getFoo() { return FOO; }

しかし、どちらがより良い練習ですか?

4

7 に答える 7

73

コードで定数を直接使用しない理由が 1 つあります。

FOO は後で変更される可能性があると仮定します (ただし、一定のままです) public static final int FOO = 10;。値を直接正しくハードコーディングするほど愚かな人がいない限り、何も壊すべきではありませんか?

someFunc(FooClass.FOO);いいえ。Java コンパイラは、上記の Foo などの定数を呼び出しコードにインライン化しますsomeFunc(5);。ライブラリを再コンパイルしても呼び出しコードを再コンパイルしないと、驚くべき状況に陥る可能性があります。関数を使用する場合、これは回避されます-JITはそれでも問題なく最適化するため、実際のパフォーマンスはそこでヒットしません。

于 2012-04-06T18:54:30.027 に答える
10

グローバル定数として使用する場合、最終変数を後で変更することはできないため、ゲッターは必要ありません。

于 2012-04-06T18:47:50.550 に答える
7

ここでは Getter は無意味であり、おそらく JVM によってインライン化されるでしょう。パブリック定数に固執するだけです。

カプセル化の背後にある考え方は、変数の不要な変更を保護し、内部表現を隠すことです。定数ではあまり意味がありません。

于 2012-04-06T18:48:23.047 に答える
4

クラス外で変数を次のように使用します。

public def FOO:Integer = 5; 

カプセル化が優先事項ではない場合。それ以外の場合は、2 番目のバリアントを使用して、変数ではなくメソッドを公開します。

private static final int FOO = 5;
...
public static getFoo() { return FOO; }

また、変数に依存しないようにコード メンテナンスを行うことをお勧めします。「時期尚早の最適化は諸悪の根源」であることを忘れないでください。

于 2012-04-06T19:21:20.360 に答える
1

クライアントコードを変更せずに将来的に実装を変更できるので、私は getFoo() にとどまります。@Tomasz が指摘したように、JVM はおそらく現在の実装をインライン化するため、多くのパフォーマンス ペナルティを支払うことになります。

于 2012-04-06T18:51:53.530 に答える
1

getFoo の結果が高く、実行時に評価する必要がない場合の最初のもの。

于 2012-04-06T18:49:14.623 に答える
0

メンバーでセッターとゲッターを使用する利点は、上書きできることです。これは、静的な「メソッド」(関数ではなく) には無効です。

インターフェイスの静的メソッドを定義する方法もありません。

私はフィールドアクセスで行きます

于 2012-04-06T18:49:45.373 に答える