Javaコンストラクタ完全理解:初期化とベストプラクティス
コンストラクタとは
コンストラクタは、オブジェクト生成時にその初期化を行う特殊なメソッド様構文です。クラス名と同名で、明示的な戻り値型を持たないのが特徴です。
主にインスタンス変数への初期値設定や、オブジェクト完全構築に必要な起動手順に使用します。
すべてのクラスはコンストラクタを持ちます。自分で定義しなければ、Javaがデフォルトコンストラクタ(全メンバ変数を0/null/falseで初期化)を自動生成します。しかし、一度でも自前でコンストラクタを定義すると、デフォルトコンストラクタは使えなくなります。
構文
class ClassName {
ClassName() { } // コンストラクタ
}
2種類のコンストラクタ
- 引数なしコンストラクタ
- 引数付きコンストラクタ(パラメータ化コンストラクタ)
引数なしコンストラクタ
パラメータを受け取らず、全インスタンスで固定の初期値を設定します。
例
public class MyClass {
int num;
MyClass() {
num = 100;
}
}
呼び出し例
public class ConsDemo {
public static void main(String[] args) {
MyClass t1 = new MyClass();
MyClass t2 = new MyClass();
System.out.println(t1.num + " " + t2.num);
}
}
100 100
引数付きコンストラクタ
1つ以上のパラメータを受け取り、インスタンスごとに異なる初期化を行います。メソッドと同様に括弧内でパラメータ宣言。
例
class MyClass {
int x;
MyClass(int i) {
x = i;
}
}
呼び出し例
public class ConsDemo {
public static void main(String[] args) {
MyClass t1 = new MyClass(10);
MyClass t2 = new MyClass(20);
System.out.println(t1.x + " " + t2.x);
}
}
10 20
コンストラクタオーバーロード
引数の数・型・順序を変えて複数のコンストラクタを定義できます。用途に応じた初期化パターンを提供可能。
オーバーロード例
public class Box {
double width, height, depth;
// 引数なし
Box() {
width = height = depth = -1; // 未初期化を示す
}
// 立方体用(1引数)
Box(double len) {
width = height = depth = len;
}
// 直方体用(3引数)
Box(double w, double h, double d) {
width = w; height = h; depth = d;
}
}
コンストラクタチェーン(this()呼び出し)
同一クラスの別コンストラクタをthis(...)で呼び出し、コード重複を避けられます。コンストラクタの最初の文でなければならない。
public class Box {
double width, height, depth;
Box() {
this(-1); // 引数1つ版を呼ぶ
}
Box(double len) {
this(len, len, len); // 引数3つ版を呼ぶ
}
Box(double w, double h, double d) {
width = w; height = h; depth = d;
}
}
スーパークラスコンストラクタ呼び出し(super())
継承時、サブクラスのコンストラクタでスーパークラスのコンストラクタをsuper(...)で明示呼び出し可能。こちらも最初の文でなければならない。
class Vehicle {
String type;
Vehicle(String t) { type = t; }
}
class Car extends Vehicle {
String model;
Car(String t, String m) {
super(t); // 親コンストラクタ呼び出し
model = m;
}
}
ベストプラクティス
- 不変オブジェクトならコンストラクタで全フィールド初期化、setterを持たない
- 引数の妥当性検証(nullチェック、範囲チェック)をコンストラクタで実施
- 複雑な初期化はファクトリメソッドやビルダーパターンを検討
- デフォルトコンストラクタが必要なら明示的に定義(引数付き定義後)
- finalフィールドはコンストラクタ完了までに必ず初期化
Java
- C++コンストラクタ完全ガイド:デフォルト、パラメータ付き、コピーの違いと実例
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Javaコンストラクタをマスター:種類、使い方、実践例
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上