Effective Java 第 2 版:第 2 章 オブジェクトの生成と消滅 項目 4
private のコンストラクタでインスタンス化不可能を強制する
java.lang.Math
のような、static な関数や定数を集めたユーティリティクラスはインスタンス化する意味がないので、インスタンス化できないようにコンストラクタを書く必要がある。
これはシングルトン実現時に使った方法と似ている。
具体的には以下のように書けばよい。
public class Utility {
private Utility() {
throw new AssertionError();
}
...
コンストラクタが private
であるため、外部からこのクラスをインスタンス化できない。
AssertionError
を投げているのは、万一内部からコンストラクタを呼び出してしまったときの保険である。
副作用として、このようなクラスのサブクラスは作れない。
これは、サブクラスの構築時にスーパークラスのコンストラクタの呼び出しがあるが、この場合、スーパークラスのコンストラクタは private
であるため、サブクラスから呼び出せないことによる。