1. 概要

この短いチュートリアルでは、Javaでコンストラクターをチェーンする方法を説明します。 これは、重複の少ないコードを作成し、読みやすくする便利なデザインパターンです。

最初に、コンストラクターチェーンとは何かについて説明します。 次に、それらを同じクラスにチェーンし、親クラスのコンストラクターを使用する方法を説明します。 最後になりましたが、このアプローチのメリットとデメリットを分析します。

2. 例を使用したコンストラクター定義の連鎖

コンストラクターチェーンは、コンストラクターのシーケンスを呼び出すプロセスです。 私たちは2つの方法でそれを行うことができます:

  • 同じクラスのコンストラクターをチェーンするためにthis()キーワードを使用する
  • 親クラスからコンストラクターをチェーンするためにsuper()キーワードを使用する

両方のアプローチを示す例を見てみましょう。

2.1. 同じクラス内のコンストラクターのチェーン

いくつかの属性を含む単純なPersonクラスを定義しましょう。

public class Person {
    private final String firstName;
    private final String middleName;
    private final String lastName;
    private final int age;

    //getters, equals and hashcode
}

firstName lastName、、および age は、オブジェクトの初期化中に常に設定する属性です。 ただし、すべての人がミドルネームを持っているわけではありません。 したがって、middleName属性はオプションです。

これを念頭に置いて、2つのコンストラクターを作成します。 最初のものは、4つの属性すべてを受け入れます。

public Person(String firstName, String middleName, String lastName, int age) {
    this.firstName = firstName;
    this.middleName = middleName;
    this.lastName = lastName;
    this.age = age;
}

2番目のコンストラクターは、3つの必須属性を受け入れ、オプションのフィールドを省略します。

public Person(String firstName, String lastName, int age) {
    this(firstName, null, lastName, age);
}

this()を使用していますキーワード。 常にコンストラクターの最初の行である必要があります 。 これにより、チェーン先のコンストラクターが最初に呼び出されるようになります。

クラス内のコンストラクターの順序は関係ないことに注意してください。 つまり、2番目のコンストラクターはどこにでも配置できます 人 クラス、そしてそれはまだ正しく動作します。

2.2. 親クラスからのコンストラクターの連鎖

前のセクションで作成したPersonクラスを継承するCustomerクラスを定義しましょう。

public class Customer extends Person {
    private final String loyaltyCardId;

   //getters, equals and hashcode
}

追加の属性が含まれています。 次に、Personクラスと同様の方法で2つのコンストラクターを作成しましょう。

public Customer(String firstName, String lastName, int age, String loyaltyCardId) {
    this(firstName, null, lastName, age, loyaltyCardId);
}

public Customer(String firstName, String middleName, String lastName, int age, String loyaltyCardId) {
    super(firstName, middleName, lastName, age);
    this.loyaltyCardId = loyaltyCardId;
}

最初のコンストラクターはthis()キーワードを使用して、2番目のコンストラクターにチェーンします。2番目のコンストラクターは、すべての必須属性とオプション属性を受け入れます。 ここでは、初めて super()キーワードを使用します。

その動作は、 this()キーワードと非常によく似ています。 唯一の違いは、 super()が親クラスの対応するコンストラクターにチェーンするのに対し、this()は同じクラスのコンストラクターにチェーンすることです。

前のキーワードと同様に、 素晴らしい() しなければならない常にコンストラクターの最初の行になります。 これは、親のコンストラクターが呼び出されることを意味します。 nそもそも。 その後、値がloyaltyCardId属性に割り当てられます。

3. チェーンコンストラクターの利点と欠点

コンストラクターチェーンの最大の利点は、重複コードが少ないです。 つまり、Do n’t Repeat Yourself( DRY )の原則を使用しています。 これは、オブジェクトの初期化が単一のコンストラクター(通常はすべての属性を受け入れるコンストラクター)で行われるためです。 他のコンストラクターは、受信したデータを渡し、欠落している属性のデフォルト値を追加するためだけのものです。

コンストラクターをチェーンすると、コードが読みやすくなります。 すべてのコンストラクター全体で属性の割り当てを繰り返す必要はありません。 代わりに、これを1か所で行います。

一方、は、コンストラクターチェーンを使用する場合に、オブジェクトを構築するためのより多くの方法を公開します。 これは、一部のプロジェクトでは重大な欠点となる可能性があります。 そのような場合は、factoryまたはbuilderパターンを探して、複数のコンストラクターを非表示にする必要があります。

4. 結論

この記事では、Javaでチェーンするコンストラクターについて説明しました。 まず、コンストラクターチェーンと呼ばれるものについて説明しました。 次に、同じクラス内のコンストラクターと、親のコンストラクターを使用してこれを行う方法を示しました。 最後に、チェーンコンストラクターの利点と欠点について説明しました。

いつものように、記事の完全なソースコードは、GitHubから入手できます。