7

使用しようとしているこのシングルトンがありますが、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)
4

4 に答える 4

3

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

java A -Dlevel=1

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

java -Dlevel=1 A

に渡そうとするとNPEが取得nullされaddToLevel(int x)、を自動的にアンボックス化しようとnullしますint x

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

于 2013-03-26T21:39:57.033 に答える
3

シングルトンには何の問題もありません。これはマルチスレッドコードではないため、同時実行の問題はありません。

あなたsはヌルだと思っていましたが、それは本当にiヌルでした。

パラメータとしてをaddToLevelとるので、は自動的にアンボックス化されました(暗黙的にからに変換されました)が、だったので、がスローされました。カバーされている値が。の場合、自動アンボックスがスローされます。intInteger iIntegerintinullNullPointerExceptionNullPointerExceptionnull

Integer.getInteger(Singleton.K_LEVEL)返される理由は、とは対照的にnull行ったためです。後者は正しい構文です。java A -Dlevel=1java -Dlevel=1 A

于 2013-03-27T19:23:54.717 に答える
2

java -Dlevel=1 Aあなたのニーズに合うはずです。

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

于 2013-03-26T22:08:57.017 に答える
1

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

于 2013-03-27T17:34:46.220 に答える