Java のプライベートコンストラクタ
コンストラクターは、クラスの最も重要な部分の 1つです。コンストラクターは最初に実行され、クラス内の何かの前に初期化する必要のある引数を渡すことができるためです。
通常、オブジェクトを任意の関数で作成できるように、パブリック修飾子を使用してコンストラクターを作成しますが、それをプライベートにしたい場合はいくつかのシナリオがあり、それを次のセクションで説明します。
Java でのプライベートコンストラクタの定義
このセクションでは、プライベートコンストラクターを使用してクラスのオブジェクトを作成しようとします。
プログラムには、ExampleClass2
と AnotherClass
の 2つのクラスがあります。AnotherClass
には、プライベート修飾子と print
ステートメントを持つコンストラクターがあります。
ExampleClass2
クラスでこのクラスのオブジェクトを作成すると、AnotherClass
にプライベートアクセスがあるというエラーが表示されます。
コンストラクターへのアクセスを制限し、このチュートリアルの次のセクションで説明する特定の方法で役立つ場合があります。
public class ExampleClass2 {
public static void main(String[] args) {
AnotherClass anotherClass = new AnotherClass();
}
}
class AnotherClass {
private AnotherClass() {
System.out.println("This is a private constructor.");
}
}
出力:
java: AnotherClass() has private access in com.tutorial.AnotherClass
Java でシングルトンパターンを使用するプライベートコンストラクタ
シングルトンパターンを使用して、プログラム全体で単一のクラスインスタンスのみを作成します。パブリックコンストラクターはプロジェクトのほぼどこからでもアクセスできるため、プライベートコンストラクターを使用します。
以下のプログラムでメッセージを表示するプライベートコンストラクターを使用して、クラス AnotherClass
を作成します。クラスのインスタンスを返す関数が必要なので、オブジェクトを作成せずに呼び出されるパブリックで静的な getInstance()
という関数を作成します。
getInstance()
メソッド内で new AnotherClass()
を返し、戻りタイプを AnotherClass
に設定します。インスタンスのメソッドを呼び出すことができるかどうかをテストするために、別の関数を作成します。
次に、AnotherClass
のインスタンスを返す getInstance()
関数を呼び出し、このインスタンスを使用して dummyMethod()
を呼び出します。
public class ExampleClass2 {
public static void main(String[] args) {
AnotherClass anotherClass = AnotherClass.getInstance();
anotherClass.dummyMethod();
}
}
class AnotherClass {
private AnotherClass() {
System.out.println("This is a private constructor.");
}
public static AnotherClass getInstance() {
return new AnotherClass();
}
public void dummyMethod() {
System.out.println("This is just a dummy method");
}
}
出力:
This is a private constructor.
This is just a dummy method
Java でビルダーパターンを使用するプライベートコンストラクタ
プライベートコンストラクターのもう 1つのユースケースは、プログラムでビルダーパターンを使用する場合です。次のコードで、3つのクラス変数 firstName
、lastName
、および age
を使用して User
クラスを作成します。
コンストラクターでこれらすべての変数を初期化し、コンストラクターをプライベートにします。
また、値を出力するメソッドも作成します。User
クラス内にオブジェクトを構築するために、BuilderClass
という名前の内部クラスを作成します。
BuilderClass
は、別のクラスがアクセスできるためパブリックです。
BuilderClass
クラスに 3つの変数を作成して、User
クラスの変数を設定します。セッターメソッドを作成して値を設定し、値とともに this
を返します。
設定された新しい値を持つ User
オブジェクトを返す buildObject()
メソッドを作成することにより、値を持つオブジェクトを返します。
ExampleClass2
クラスでは、パブリックであるため、BuilderClass()
クラスを取得します。次に、UserBuilder
オブジェクトを使用して、その setter メソッドを使用して値を設定してから、User
オブジェクトを返す buildObject()
メソッドを呼び出します。
getUserDetails()
関数を呼び出して値を出力します。
public class ExampleClass2 {
public static void main(String[] args) {
User.BuilderClass userBuilder = new User.BuilderClass();
User getUser = userBuilder.setFirstName("Micheal").setLastName("Fisk").setAge(26).buildObject();
getUser.getUserDetails();
}
}
class User {
private final String firstName;
private final String lastName;
private final int age;
private User(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public void getUserDetails() {
System.out.println("First Name: " + firstName);
System.out.println("Last Name: " + lastName);
System.out.println("Age: " + age);
}
public static class BuilderClass {
private String firstName;
private String lastName;
private int age;
BuilderClass setFirstName(String firstName) {
this.firstName = firstName;
return this;
}
BuilderClass setLastName(String lastName) {
this.lastName = lastName;
return this;
}
BuilderClass setAge(int age) {
this.age = age;
return this;
}
public User buildObject() {
return new User(firstName, lastName, age);
}
}
}
出力:
First Name: Micheal
Last Name: Fisk
Age: 26
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn