放課後プログラミング

調べたことや考えたことなどを忘れないために書きます。

Singletonなクラスとstaticクラスの使い分け

よくわからなかったので調べました。
http://javarevisited.blogspot.com.au/2013/03/difference-between-singleton-pattern-vs-static-class-java.html

おさらい。

Singletonなクラス

public class SingletonExample {

    private static SingletonExample singletonExample = new SingletonExample();

    private SingletonExample() {}

    public static SingletonExample getInstance(){
        return singletonExample;
    }
}

インスタンスはクラスロード時に作成され、コンストラクタprivateなのでそれ以上のインスタンスは作成されない代わりに、getInstanceメソッドでクラスロード時に作成されたインスタンスを取得できる。2つ以上のインスタンスが生成できない。
例としてはjava.lang.Runtimeが挙げられる。

staticクラス

public final class StaticExample {

    private StaticExample() {}

    public static Example1() {...}

    public static Example2() {...}

    public static Example3() {...}
}

呼ばれないコンストラクタ以外staticメソッド/メンバーのみで構成されている。インスタンスは生成できない。
例としてはjava.lang.Mathが挙げられる。

Singletonとstaticの違い

1. staticクラスはコンパイル時にバインドされるため、パフォーマンスが良い。
2. Singletonなクラスのメソッドはオーバーライドできる。staticクラスのメソッドはできない
3. SingletonなクラスはUnitテストが書きやすい。なぜなら多くの引数を渡さずとも、モックオブジェクトを作成して呼び出せばよいから。
4. 状態を保持する必要なとき、Singletonなクラスであれば簡単に実現可能。
5. Singletonなクラスが大きい場合、ロードが重いことがある。
6. 多くのDIをサポートするフレームワークはSingletonを簡単に使えるようにしてくれている。

Singletonの使い時

よりオブジェクト指向なプログラミングができる。具体的には継承、ポリモーフィズムを使ったり、インターフェースを用意して、複数の実装を持つことができる。
オブジェクト指向な柔軟性が必要なときはSingletonを選ぶのがいい。

staticの使い時

状態を保持する必要がない場合や、utility系のメソッドを詰め込んだクラスなどを作る場合は、staticクラスを使った方が速い。