2012-02-19 8 views
12

は、我々は静的な初期化ブロックを使用します。スタティック初期化は良いプログラミングですか? Javaでは

private static final ApiKey API_KEY; 

static { 
    API_KEY = new ApiKey(); 
} 

を私は

  • が、それは良いプログラミング習慣であることの不思議でしたか?
  • このパターンはどこで使用しますか?

ありがとうございます。

+1

を書くでしょう、あなたの質問に対する「黒または白の」答えはありませんので、私はコメントします。個人的には、静的アクセサはプログラマの親友ではありません。Dependency Injectionは、テストに関しては多くの面で役立つ非常に良い選択肢です。 –

+1

スタティックブロックで新しいスレッドが開始されるコードを見てきました。 :)それは非常に悪かった。 –

答えて

9

ある程度、それは味の問題です。

  • あなたは
  • を行っているとして、あなたが参照するオブジェクトは不変で、スレッドセーフな

静力学であることを確認し、フィールドの最終を保つ書き込みをする傾向がある。私にはそれがいる限り大丈夫です良いテストが難しい。静的状態の修正を開始したい場合は、おそらく設計をもう一度見直す必要があります。

Google Guiceとその非常に良いSingleton implementationを見てみることを検討してください。

もちろん、アプリケーションが10行の単一クラスの実験であれば、これは全体としてはるかに重要です。あなたの例では、あなたが単純化でき

注:

private static final ApiKey API_KEY = new ApiKey(); 

しかし常に可能ではありません。おそらくより複雑な初期化コードを省略したでしょうか?この場合Guiceはもう一度見る価値があるでしょう。

3

あなたは以下のコードを使用して、完全に静的初期化子ブロックを使用して避けることができ:

private static final ApiKey API_KEY = new ApiKey(); 

または

private static final ApiKey API_KEY = createNewApiKey(); 

APIキーの作成だけでコンストラクタ呼び出しよりも多く必要とする場合

。それはコードをより読みやすくします。しかしそれはあまり重要ではありません。

static { 
    // compute some values 
    A = somePartOfTheComputedValues(); 
    B = someOtherPartOfTheComputedValues(); 
} 

それでも、A及びBは、おそらく1つのオブジェクトにリファクタリングすることができ、単一で作成される2つの静的フィールドが同一の初期化コードに依存する場合

静的初期化が有用です方法。

2

可能な限り、私は列挙型を使いたいです。

代わりの

class ApiKey {   
    private static final ApiKey API_KEY; 

    static { 
     API_KEY = new ApiKey(); 
    } 

私は

enum ApiKey { 
    INSTANCE; 
関連する問題