web-dev-qa-db-ja.com

ゲッターを使用した「パブリックスタティックファイナル」または「プライベートスタティックファイナル」

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

public static final int FOO = 5;

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

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

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

48
Chris Cummins

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

FOOは後で変更される可能性がある(ただし、一定のまま)、たとえば_public static final int FOO = 10;_と仮定します。値を直接ハードコーディングするのに十分な愚かな人がいない限り、何も壊してはいけませんか?

いいえ。Javaコンパイラーは、上記のFooなどの定数を呼び出しコードにインライン化します。つまり、someFunc(FooClass.FOO);someFunc(5);になります。関数を使用する場合、JITはそれを最適化するため、実際のパフォーマンスは低下しません。

63
Voo

最終的な変数は、グローバル定数として使用する場合、後で変更することはできないため、ゲッターを必要としないように公開するだけです。

8
Serdar Dogruyol

ここでは、Getterは無意味であり、JVMによってインライン化される可能性が高いでしょう。パブリック定数に固執するだけです。

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

4

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

public def FOO:Integer = 5; 

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

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

また、変数に依存しないようにコードを保守することをお勧めします。 「時期尚早の最適化がすべての悪の根源である」ことを忘れないでください。

3
profimedica

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

1
shams

GetFooの最初の結果は定数であり、実行時に評価する必要はありません。

0
dash1e

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

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

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

0
stefan bachert