Effective Java 第 2 版:第 2 章 オブジェクトの生成と消滅 項目 4

private のコンストラクタでインスタンス化不可能を強制する

java.lang.Math のような、static な関数や定数を集めたユーティリティクラスはインスタンス化する意味がないので、インスタンス化できないようにコンストラクタを書く必要がある。 これはシングルトン実現時に使った方法と似ている。 具体的には以下のように書けばよい。

public class Utility {
    private Utility() {
        throw new AssertionError();
    }
    ...

コンストラクタが private であるため、外部からこのクラスをインスタンス化できない。 AssertionError を投げているのは、万一内部からコンストラクタを呼び出してしまったときの保険である。

副作用として、このようなクラスのサブクラスは作れない。 これは、サブクラスの構築時にスーパークラスのコンストラクタの呼び出しがあるが、この場合、スーパークラスのコンストラクタは private であるため、サブクラスから呼び出せないことによる。

参考文献

EFFECTIVE JAVA 第2版 (The Java Series)

EFFECTIVE JAVA 第2版 (The Java Series)