private のコンストラクタでインスタンス化不可能を強制する
java.lang.Math
のような、static な関数や定数を集めたユーティリティクラスはインスタンス化する意味がないので、インスタンス化できないようにコンストラクタを書く必要がある。
これはシングルトン実現時に使った方法と似ている。
具体的には以下のように書けばよい。
public class Utility { private Utility() { throw new AssertionError(); } ...
コンストラクタが private
であるため、外部からこのクラスをインスタンス化できない。
AssertionError
を投げているのは、万一内部からコンストラクタを呼び出してしまったときの保険である。
副作用として、このようなクラスのサブクラスは作れない。
これは、サブクラスの構築時にスーパークラスのコンストラクタの呼び出しがあるが、この場合、スーパークラスのコンストラクタは private
であるため、サブクラスから呼び出せないことによる。
参考文献
EFFECTIVE JAVA 第2版 (The Java Series)
- 作者: Joshua Bloch,柴田芳樹
- 出版社/メーカー: 丸善出版
- 発売日: 2014/03/11
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (12件) を見る