Javaでコンストラクタを連鎖させる
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()は同じクラスのコンストラクターにチェーンすることです。
前のキーワードと同様に、 素晴らしい() しなければならない
3. チェーンコンストラクターの利点と欠点
コンストラクターチェーンの最大の利点は、重複コードが少ないです。 つまり、Do n’t Repeat Yourself( DRY )の原則を使用しています。 これは、オブジェクトの初期化が単一のコンストラクター(通常はすべての属性を受け入れるコンストラクター)で行われるためです。 他のコンストラクターは、受信したデータを渡し、欠落している属性のデフォルト値を追加するためだけのものです。
一方、は、コンストラクターチェーンを使用する場合に、オブジェクトを構築するためのより多くの方法を公開します。 これは、一部のプロジェクトでは重大な欠点となる可能性があります。 そのような場合は、factoryまたはbuilderパターンを探して、複数のコンストラクターを非表示にする必要があります。
4. 結論
この記事では、Javaでチェーンするコンストラクターについて説明しました。 まず、コンストラクターチェーンと呼ばれるものについて説明しました。 次に、同じクラス内のコンストラクターと、親のコンストラクターを使用してこれを行う方法を示しました。 最後に、チェーンコンストラクターの利点と欠点について説明しました。
いつものように、記事の完全なソースコードは、GitHubでから入手できます。