2013-03-26 25 views
6

は、私が使用しようとしているこのシングルトンを持っているが、のgetInstanceは明らかにnullを返すことができます。Java Singleton.getInstance()はnullを返しますか?

class Singleton { 
    public static final String K_LEVEL = "level"; 
    static Singleton instance = new Singleton(); 
    private int level; 

    static Singleton getInstance() { 
     return instance; 
    } 

    int getLevel() { 
     return level; 
    } 

    void incrementLevel() { 
     System.out.println("LEVEL INCREASED TO " + ++level); 
    } 

    void addToLevel(int x) { 
     for(int i=0;i<x;i++) 
      incrementLevel(); 
    } 

} 

class A { 
    public static void main(String[] args) { 
     Singleton s = Singleton.getInstance(); 
     Integer i = Integer.getInteger(Singleton.K_LEVEL); 
     s.addToLevel(i); 
    } 
} 

は、私はJavaでシングルトンを実装聞いたが非常に困難となりやすい条件をレースすることです。私のシングルトンパターンは正しく実装されていますか?私は最近、このように見えるようにコードを変更しました。そして今、getInstanceはnullを返します。どうして?

$ java A -Dlevel=1 
Exception in thread "main" java.lang.NullPointerException 
    at A.main(A.java:29) 
+1

's.addToLevel(i);' print'の直前にある 'System.out.println(i);'とは何ですか? – jlordo

答えて

2

シングルトンに問題はありません。これはマルチスレッド化されたコードではないため、並行性の問題はありません。

sはnullだと考えていましたが、実際はiはnullです。

addToLevelパラメータとしてintを要するので、Integer iを(暗黙intIntegerから変換)autounboxedたが、inullたため、NullPointerExceptionが送出しました。 Autounboxingは、覆われている値がnullのときNullPointerExceptionをスローします。

理由Integer.getInteger(Singleton.K_LEVEL)java -Dlevel=1 Aとは対照的に、あなたがjava A -Dlevel=1をしたので、nullが返さ。後者は正しい構文です。

2

これは私にとってうまくいくシングルトンパターンではありません。 nullを返すのはInteger.getInteger(Singleton.K_LEVEL);メソッドです。私は"level"システムプロパティが設定されておらず、nullであると確信しています。

私のコメントから、-Dlevel=1の前に、Aクラスをコマンドラインで置く必要があります。コードをデバッグするか、システムプロパティを出力すると、それがnullであることがわかります。

あなたはaddToLevel(int x)nullに合格しようと、それはnullint xする自動VHS版にしようとするときは、NPEを取得します。

このクラスが複数のスレッドで使用されている場合は、Singletonクラス内のAtomicIntegerを再入可能とすることを検討する必要があります。

+0

いいえ、私は次のように設定しました: 'java A -Dlevel = 1' – Dog

+1

' -D'は 'A'クラス@Dogの前にある必要があります。私はあなたのコードをデバッグするか、それを確認するためにシステムプロパティを出力します。 – Gray

+1

私は同意します。 @Dogなぜ私はあなたが確認するaddToLevelを呼び出す前に私は印刷しないでください。 –

1

java -Dlevel=1 Aは、お客様のニーズに合わせてください。

docから、構文はjava [ options ] class [ argument ... ]であり、-Dlevel=1はオプションと見なされます(optionsセクションを参照)。

0

static Singleton instance = new Singleton();は、競合状態を防ぐために最終的にする必要があります。

関連する問題