2009-10-29 21 views
38

javaのクラスのプライベートな静的メンバーを初期化する方法。以下しよう静的変数の初期化java

public class A { 
    private static B b = null; 
    public A() { 
     if (b == null) 
     b = new B(); 
    } 

    void f1() { 
     b.func(); 
    } 
} 

が、()をクラスAの第2の目的を作成し、F1を呼び出すには、私は、nullポインタ例外を取得します。

+0

公共のコンストラクタ –

+0

ok typing mistakeを使用する必要があります。 –

+1

どのコード行でNULLポインタ例外が発生しますか? –

答えて

68

好適な方法は、どちらかである

private static final B a = new B(); // consider making it final too 

またはより複雑な初期化コードのためにあなたは:あなたはまた、より直接的にそれを初期化することができ


静的イニシャライザブロックを使用できます:

private static final B a; 

static { 
    a = new B(); 
} 
+2

Bのコンストラクタとして例外をスローするように静的初期化子ブロックを使用しました。それでも私は同じエラーが発生します。ライブラリ関数への最初の呼び出しは機能しますが、2番目の呼び出しは機能しません。 –

+2

静的メンバーを初期化する好ましい方法は、実際の状況によって異なります。このパターンで*すべての*静的メンバーを作成するソフトウェアは、アプリケーションの起動時にパフォーマンスが低下します。非自明な状況では、私はその理由のために怠惰な初期化パターンを好む。 – rsp

+1

@rsp:あなたはあなたのパフォーマンス上の懸念を抱えています(起動時ではなく、クラスがロードされたときに正しい - これは同じかもしれませんが、そうである必要はありません)。初期化を行うと、コードに複雑さが追加されるため、静的メンバーを初期化するこの方法はまだ考えています。これは、正当な理由を除いて回避する必要があります。パフォーマンスがそのような理由の一つかもしれません。 – sfussenegger

4

あなたのコードはうまくいくはずです。正確なコードを投稿してもよろしいですか? (前述のように)静的メンバを初期化する

public class A { 

     private static B b = new B(); 

     A() { 
     } 

     void f1() { 
     b.func(); 
     } 
    } 
関連する問題