Java のプライベートコンストラクタ

Rupam Yadav 2023年10月12日
  1. Java でのプライベートコンストラクタの定義
  2. Java でシングルトンパターンを使用するプライベートコンストラクタ
  3. Java でビルダーパターンを使用するプライベートコンストラクタ
Java のプライベートコンストラクタ

コンストラクターは、クラスの最も重要な部分の 1つです。コンストラクターは最初に実行され、クラス内の何かの前に初期化する必要のある引数を渡すことができるためです。

通常、オブジェクトを任意の関数で作成できるように、パブリック修飾子を使用してコンストラクターを作成しますが、それをプライベートにしたい場合はいくつかのシナリオがあり、それを次のセクションで説明します。

Java でのプライベートコンストラクタの定義

このセクションでは、プライベートコンストラクターを使用してクラスのオブジェクトを作成しようとします。

プログラムには、ExampleClass2AnotherClass の 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つのクラス変数 firstNamelastName、および 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 Yadav
Rupam Yadav avatar Rupam Yadav avatar

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

関連記事 - Java Constructor