読者です 読者をやめる 読者になる 読者になる

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)