011-003-008
this()でコンストラクタを呼び出す
中級
問題説明
コンストラクタチェーン: 重複した初期化の排除
this()は、あるコンストラクタから同じクラス内の別のコンストラクタを呼び出すことを可能にします。これはコンストラクタチェーンと呼ばれ、複数のコンストラクタが重複した初期化を持つ場合にコードの重複を避けるために不可欠です。
一緒にコンストラクタチェーンの実装方法を学んでいきましょう。
学習目標
- 複数の初期化パターンを持つクラスに対して、this()を使用したコンストラクタチェーンを設計し、コードの重複を排除できる
- テレスコーピングパターンを適用して、シンプルから複雑へと段階的に初期化するコンストラクタ群を構築できる
- this()とsuper()の使用タイミングと制約を評価し、適切なコンストラクタ呼び出し戦略を正当化できる
学習ポイント
- this(): 同じクラスの別のコンストラクタを呼び出す
- super(): 親クラスのコンストラクタを呼び出す
- 最初の文ルール: コンストラクタの最初の行でなければならない
- テレスコーピングパターン: シンプルから複雑なコンストラクタへチェーン
this() vs super()
| 観点 | this() | super() |
|---|---|---|
| 呼び出し先 | 同じクラスのコンストラクタ | 親クラスのコンストラクタ |
| 使用場面 | クラス内に複数のコンストラクタ | 継承シナリオ |
| 暗黙的? | いいえ | はい(指定なしでsuper()) |
| 位置 | 最初の行必須 | 最初の行必須 |
よくある間違い
間違えても大丈夫です。コンストラクタの呼び出し順序をもう一度確認してみましょう。
間違い1: this()が最初の行でない
コンパイルエラー:
public Person(String name) {
System.out.println("Creating person"); // エラー!
this(name, 0); // this()は最初でなければならない!
}正しいコード:
public Person(String name) {
this(name, 0); // 最初の行 - OK
// this()の後に他のコード
}間違い2: コンストラクタの循環呼び出し
コンパイルエラー(無限ループ):
public Person(String name) {
this(name, 0); // 2引数版を呼ぶ
}
public Person(String name, int age) {
this(name); // 1引数版を呼ぶ - 循環!
}テレスコーピングコンストラクタパターン
class Person { private String name; private int age;// 主コンストラクタ - 全ての初期化をここで public Person(String name, int age) { this.name = name; this.age = age; } // 便利コンストラクタは主にチェーン public Person(String name) { this(name, 0); // デフォルト年齢 } public Person() { this("Unknown"); // デフォルト名前 }
}
実務での応用
- デフォルト値: オプション引数にデフォルトを提供
- バリデーション: 1つのコンストラクタにバリデーションを集約
- API柔軟性: オブジェクト作成の複数の方法
- ビルダー代替: フルビルダーパターン不要のシンプルなケース
設計のガイドライン
- 全てのバリデーションを最も完全なコンストラクタに配置
- コンストラクタチェーンは短く(最大2〜3レベル)
- オプション引数が多い場合はビルダーパターンを検討
- デフォルト値をJavadocにドキュメント化
前提知識の詳細説明
この問題を解くために必要な知識を確認しましょう。
基本概念
この問題で扱うプログラミングの基本概念を理解することが、正しい解答への第一歩です。コードの各要素がどのように連携して動作するかを把握しましょう。
実装アプローチ
問題を解くための考え方を段階的に整理します:
- 問題文を読み、入力と出力の関係を理解する
- 必要な変数やデータ構造を特定する
- 処理の流れを組み立てる
- テストケースで動作を確認する
