2017-08-10 9 views
0

ここでシングルトンクラスを練習しようとしていました。シングルトンクラスのメンバ変数の単一コピー

public class StaticClass { 

    public static StaticClass staticObject = new StaticClass(); 

    private int counter; 

    private StaticClass() { 

    } 

    public static StaticClass getMyObject() { 
     return staticObject; 
    } 

    public Integer showCounter() { 
     return ++counter; 
    } 
} 

public class TestSingleton { 

    public static void main(String[] args) { 

     new TestSingleton().testImplementation(); 
    } 

    public void testImplementation() { 
     StaticClass obj1 = StaticClass.getMyObject(); 

     Integer obj1Int = obj1.showCounter(); 

     StaticClass obj2 = StaticClass.getMyObject(); 

     Integer obj2Int = obj2.showCounter(); 

     StaticClass obj3 = StaticClass.getMyObject(); 

     Integer obj3Int = obj3.showCounter(); 

     System.out.println(obj1Int+","+obj2Int+","+obj3Int); 
    } 
} 

ここでは、カウンタ変数の単一コピーを維持するのは混乱していません。

プログラムを実行した後、私は1,2,3と異なる値のカウンタを取得しています。

なぜ複数の値がありますか?

+0

showCounter()は、値を返す前にカウンタをインクリメントして値を変更します。あなたが見ている出力は期待されます。 – jhauris

答えて

2

showCounter()メソッドには、呼び出したときにカウンタを増加させる副作用があるため、呼び出すたびに異なる数値が得られます。

public Integer showCounter() { 
    return ++counter; 
      ^^----------- This adds 1 to the counter. 
} 

それは、showと呼ばれる方法でそのような副作用を持つように混乱ビット以上です。私は2つの方法に分解します:

public int getCounter() { 
    return counter; 
} 

public int incrementCounter() { 
    return ++counter; 
} 

さらに、AtomicIntegerをJDKで見てください。スレッドセーフとアトミックなカウンタが必要な場合は、これをすべて実行します。

+0

私はクラスの単一のコピーを持っているので、それをインクリメントした後でもカウンタの単一のコピーを維持することは可能ですか? – Ankit

+0

はい、カウンタのコピーは1つのみです。それは静的なものなので、作成するクラスのインスタンス数は関係ありません。 – Todd

+0

出力を '3,3,3'とすることは可能ですか? – Ankit

1

これがシングルトンの仕組みです。

obj1 == obj2を比較すると、trueを返すことがわかります。

したがって、いずれかのオブジェクトでshowCounterを呼び出すと、唯一のStaticClassのインスタンス上の同じカウンタが更新されます。

関連する問題