こちらを読むと
- コンストラクタをprivateにすべき事例がわかります
- 記事の所要時間は10分です
結論
コンストラクタをprivateにすべきときは、以下です。
- 定数クラス
- ユーティリティクラス
- シングルトン
詳細に説明していきます。
コンストラクタおさらい
コンストラクタとは、クラスからインスタンスを生成するときに呼び出すメソッドのことです。
クラスにより、インスタンスの”型”を1つ定義しておき、そこから複数のインスタンスを作ることができます。
コンストラクタは通常はpublic
コンストラクタは通常、publicにして、外部からアクセス可能にします。
なぜかというと、そのクラス自体で完結するシステムはほとんど無く、別の利用者(クラス)からクラスを使うことが多いためです。
別の利用者から使うためには、利用者側からインスタンスを生成する必要があり、そのためにはコンストラクタをpublicなどで公開する必要があります。
privateコンストラクタとは
ではどういうときに、コンストラクタをprivateにするのでしょうか?
そのケースは大きく2つに分かれると思います。
- インスタンスを生成する必要がないケース
- 生成できるインスタンスの数を限定したいケース
それぞれ説明していきます。
インスタンスを生成する必要がないケース
以下のクラスをみてください。こちらは定数クラスで、メンバ変数やメソッドは存在せず、持っているものは定数のみです。
1 2 3 4 5 6 |
public class Constant { public static final String COUNTRY_NAME = "JAPAN"; public static final double PI = 3.14; // コンストラクタ. private Constant() {} } |
次にこちらのクラスを見てください。こちらはユーティリティクラスで、staticなメソッドのみを持っています。
1 2 3 4 5 6 7 8 9 10 |
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つとも、インスタンスを生成する必要がありません。例えば、以下のように呼び出すことができますね。
1 2 3 |
Systen.out.println("私の国は" + Constant.COUNTRY_NAME + "です。") int Triangulum = Util.calcTriangulum(5, 3); |
生成できるインスタンスの数を限定したいケース
有名なシングルトンのケースです。シングルトンでなくても、インスタンスを2つしか作れない、3つしか作れないなど、数を限定したいケースでもよいです。
1 2 3 4 5 6 7 8 |
public class God { private class me = new God(); // コンストラクタ. private God() {} public God getInstance() { return me; } } |
Godは1つしか存在せず、外部から自由に作られるとまずいので、コンストラクタをprivate にしておく必要があります。
まとめ
コンストラクタをprivateにすべきときが分かりました。大きく以下の3点です。
- 定数クラス
- ユーティリティクラス
- シングルトン
定数クラスやユーティリティクラスのインスタンスを生成できても実害はないですが、意味のないことなので、private コンストラクタで禁止するように強制しましょう。
筆者はJavaエンジニアで、日ごろからJavaなどプログラミングの有益な情報を発信しているので、よかったらTwitterをフォローしてみてください。