Java オブジェクト指向

Java コンストラクタをprivateにするとき

投稿日:

こちらを読むと

  • コンストラクタをprivateにすべき事例がわかります
  • 記事の所要時間は10分です

結論

コンストラクタをprivateにすべきときは、以下です。

  • 定数クラス
  • ユーティリティクラス
  • シングルトン

詳細に説明していきます。

コンストラクタおさらい

コンストラクタとは、クラスからインスタンスを生成するときに呼び出すメソッドのことです。

クラスにより、インスタンスの”型”を1つ定義しておき、そこから複数のインスタンスを作ることができます。

クラスからインスタンス生成

コンストラクタは通常はpublic

コンストラクタは通常、publicにして、外部からアクセス可能にします。
なぜかというと、そのクラス自体で完結するシステムはほとんど無く、別の利用者(クラス)からクラスを使うことが多いためです。

別の利用者から使うためには、利用者側からインスタンスを生成する必要があり、そのためにはコンストラクタをpublicなどで公開する必要があります。

利用者側からインスタンス生成して使う

privateコンストラクタとは

ではどういうときに、コンストラクタをprivateにするのでしょうか?

そのケースは大きく2つに分かれると思います。

  1. インスタンスを生成する必要がないケース
  2. 生成できるインスタンスの数を限定したいケース

それぞれ説明していきます。

インスタンスを生成する必要がないケース

以下のクラスをみてください。こちらは定数クラスで、メンバ変数やメソッドは存在せず、持っているものは定数のみです。

public class Constant {
  public static final String COUNTRY_NAME = "JAPAN";
  public static final double PI = 3.14;
  // コンストラクタ.
  private Constant() {}
}

次にこちらのクラスを見てください。こちらはユーティリティクラスで、staticなメソッドのみを持っています。

public class Util {
  public static int calcTriangulum(int base, int height) {
    return base * height / 2;
  }
  public static int calcTrapezoid(int top, int bottom, int height) {
    return (top + bottom) * height / 2;
  }
  // コンストラクタ.
  private Util() {}
}

2つとも、インスタンスを生成する必要がありません。例えば、以下のように呼び出すことができますね。

Systen.out.println("私の国は" + Constant.COUNTRY_NAME + "です。")

int Triangulum = Util.calcTriangulum(5, 3);

生成できるインスタンスの数を限定したいケース

有名なシングルトンのケースです。シングルトンでなくても、インスタンスを2つしか作れない、3つしか作れないなど、数を限定したいケースでもよいです。

public class God {
  private class me = new God();
  // コンストラクタ.
  private God() {}
  public God getInstance() {
    return me;
  }
}

Godは1つしか存在せず、外部から自由に作られるとまずいので、コンストラクタをprivate にしておく必要があります。

まとめ

コンストラクタをprivateにすべきときが分かりました。大きく以下の3点です。

  • 定数クラス
  • ユーティリティクラス
  • シングルトン

定数クラスやユーティリティクラスのインスタンスを生成できても実害はないですが、意味のないことなので、private コンストラクタで禁止するように強制しましょう。

筆者はJavaエンジニアで、日ごろからJavaなどプログラミングの有益な情報を発信しているので、よかったらTwitterをフォローしてみてください。



-Java, オブジェクト指向

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

Java ジェネリクスクラス

こちらを読むと Javaのジェネリクス クラスの定義方法、使用例が分かります。 ジェネリクスとは ジェネリクスとは”一般的”という意味で、IntegerやStringなど特定の …

Dependency Injection(DI) パターン

こちらを読むと オブジェクト指向のDependency Injection(DI) パターンの概要が分かります。記事の所要時間は10分です 結論 柔軟性のある設計をするために、Dependency I …

staticファクトリメソッドの利点[Java]

こちらを読むと Java オブジェクト指向のデザインパターンであるstaticファクトリメソッドの利点、使用例を知ることができます記事を読む所要時間は10分です。 結論 staticファクトリメソッド …