Java講座

堅牢性を獲得する章
2.1. ユーティリティクラス
『目的』

ユーティリティクラスでの無駄をなくしましょう。

『Before』

ユーティリティクラスとは、static メソッドと static 変数だけが含まれているクラスを指します。
たとえば java.lang.Math クラスなどがそうですね。

ユーティリティクラスはインスタンス化されるように設計されているわけではありません。
そのインスタンスは意味がありません。

よく見かけるユーティリティクラスにこのようなものがあります。
public final class UtilHoge {
    /* メソッド。 */
    public static final void foo() {
           :
    }
}
このクラスはコンストラクタを明示的に記載していないです。
その場合、public な引数なしのコンストラクタが存在するのと同等ですね。

なので、インスタンス化できてしまいます。
/* インスタンス化できてしまう。 */
UtilHoge util = new UtilHoge();
意味無いことができるような状態は好ましくありませんね。

『After』

無駄なインスタンスは作らせないようにすべきです。

1つの明示的な private コンストラクタを含ませれば防止できます。
コンストラクタが private であれば、決して外部からアクセスできません。
よって、クラス自身から呼び出さない限りインスタンス化されないことが保証されます。

たとえば java.lang.Math はコンストラクタが private になっていますね。
public final strictfp class Math {
    /**
     * Don't let anyone instantiate this class.
     */
    private Math() {}
      :
}
コンストラクタは呼び出せません。
/* インスタンス化できない。 */
// Math mathUtil = new Math();
もし、ユーティリティクラスのサブクラス化をしたかったらコンストラクタを protected としましょう。

サブクラス化前提のユーティリティクラスです。
public class UtilHoge { // final を取り除く

    protected UtilHoge() {
        // サブクラスからのコールを禁止する
        throw new UnsupportedOperationException(); 
    }

    /* メソッド。 */
    public static final void foo() {
           :
    }
}

『まとめ』

ユーティリティクラスは、インスタンス化されないよう明示的にprivate もしくは protected コンストラクタを記載しましょう。
前のページ   次のページ

当ページ・当社へのご意見やご感想があればお手数ですが「お問い合わせ」までお願いいたします。
当社への就職をお考えの方は「採用情報ページ」までお願いいたします。
C言語を学びたい方は「C言語講座」もどうぞ。