The King's Museum

ソフトウェアエンジニアのブログ。

【Effective Java】項目4:private のコンストラクタでインスタンス化不可能を強制する

static のメソッドと static なフィールドだけからなるクラスを書く場合は private コンストラクタでインスタンス化不可能をクライアントに強制するべきである。

static ユティリティクラス

そのようなクラスは悪く評価されていることもあるが、java.lang.Math や java.util.Array のように、基本データ型や配列に対する関連したメソッドをまとめるためには有用である。

インスタンス化を防ぐためにクラスを抽象化することは無意味。ライブラリを利用する人はサブクラスを生成し、結局、インスタンスを生成されてしまう。 特に抽象クラスを用いるとユーザーに、継承するために作られているクラスだと誤解させる。

インスタンス化を防ぐ

インスタンス化させないことを明示的にするため 1 つの明示的な private コンストラクタを作る。

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

この明示的なコンストラクタは private なので外部からはアクセス不能。 AssertionError は必須ではないが、意図せぬ呼び出しを防ぐことができる。

また、この手法は副作用としてクラスのサブクラスのインスタンスを作ることも防いでくれます。

感想

これはよくある手法だと思う。実際いろんな場所でよく見るしね。

ただ、throw AssertionError までやってるかなぁ。。。大きいオープンソースのライブラリとかだとやってるのかな。 単にサポートしてないメソッド呼び出しでサポートしてません例外が出ることはたまに見かけるけどなぁ…

EFFECTIVE JAVA 第2版 (The Java Series)

EFFECTIVE JAVA 第2版 (The Java Series)

Kindle 版はこちら(ただし英語)

Effective Java: A Programming Language Guide (Java Series)

Effective Java: A Programming Language Guide (Java Series)

(c) The King's Museum