2012-04-06 13 views
41

Javaでは、より良いカプセル化を可能にするために変数をプライベートに保つ必要があると教えられていますが、静的定数はどうですか?これは:getterで 'public static final'または 'private static final'ですか?

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

しかし、これは実際より良いです:

public static final int FOO = 5; 

これに結果で同等のでしょうか?

+0

投票は、建設的ではない(既に提案されている意見のフィードバックに基づいて)。 'FOO'は本当に定数ですか? APIの 'FOO'を提供するクラスはありますか?またはエンドポイントアプリケーションの一部ですか?変化しない数学定数があります。変更してはならないビットフラグもあります(SWTを参照)。だから答えは "それは依存している。" –

答えて

53

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

FOOは後で変わるかもしれませんが(それでも一定のままです)、例えばpublic static final int FOO = 10;とします。誰かが値を直接ハードコーディングするのに十分なほど愚かでない限り、何かを壊すべきではありませんか?

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

public def FOO:Integer = 5; 

+3

興味深いことに、私は決してこれを認識しませんでした。しかし、私は決して野生のゲッターで定数を見つけることはありません。 –

+0

情報をありがとう、それは私的定数とゲッターは経験的に安全な選択肢であると思われます –

+2

@Chris定数には何が依存しているのですか?石で設定された定数がたくさんあります(例えば、Piはこれらの年の後に3となることはほとんどありません))すべての場合に公的な定数の使用を非難することはありませんが、このような問題のデバッグは非常に恐ろしいため、これを覚えておいてください。 – Voo

7

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

+6

最終的な変数を決して変更することは絶対に確実な場合のみです。定数はコンパイラによってインライン展開され、後で変更された場合に非常に驚くべき結果につながり、すべてを再コンパイルしません。 – Voo

3

ゲッターはここでは無意味であり、おそらくJVMによってインライン化されます。ただ公の定数に固執するだけです。

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

0

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

0

メンバーでsetterとgetterを使用する利点は、上書きできることです。 これは静的な "メソッド"(むしろ関数)には無効です

静的メソッドを定義する方法もありません。

私はそれはあなたがクライアントコードを変更せずに、将来的に実装を変更することができますので、私はからgetfoo()でいたいフィールドアクセス

0

となるだろう。 @ Tomasz氏に​​よると、JVMはおそらく現在の実装をインライン化するので、パフォーマンスのペナルティを払うことになるでしょう。

2

はとクラスの外varialesを使用してください。それ以外の場合は、変数ではなくメソッドを公開するように、2番目のバリアントを使用します。

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

また、コードメンテナンスでは変数に依存しない方が良いです。 「時期尚早の最適化はすべての悪の根源です」と覚えておいてください。

関連する問題