🖥️

プログラミング自己主導学習 [Java] @NoArgsConstructorと@AllArgsConstructorの役割

2025/03/14に公開

1. @NoArgsConstructor

  • 役割

パラメータのない基本生成者(No-Args-Constructor)を自動的に生成する。

JPAエンティティや直列化などのために基本生成者が必要な場合に有用。

import lombok.NoArgsConstructor;

@NoArgsConstructor
public class User {
    private String name;
    private int age;
}

public User() {}  // 基本生成者が自動的に生成
// クラスにfinal フィールドがある場合、基本的にコンパイル エラーを発生させる。
// これを解決するためにforce=trueオプションを使用する。
// force=trueオプションを与えると、finalフィールドがある場合でも強制的にデフォルト値(0、null、falseなど)を
// 設定して基本生成者を生成する。
@NoArgsConstructor(force = true)
public class User {
    private final String name;
    private final int age;
}
  • 基本生成者(Default Constructor)
  • すべてのクラスには生成者が存在し、1 つ以上を持つことができる。

  • パラメータのない生成者で、クラスがインスタンス化される時、何の初期化値も受けずにオブジェクトを生成する。

(クラスに生成者宣言がなければ、コンパイラは次のような基本生成者(Default Constructor)を

バイトコードファイルに自動的に追加させる。

2. @AllArgsConstructor

  • 役割

クラスのすべてのフィールドをパラメータとして受け取る生成者(All-Args-Constructor)を自動的に生成する。

オブジェクトをフィールド値と一緒に一度に生成するときに有用。

import lombok.AllArgsConstructor;

@AllArgsConstructor
public class User {
    private String name;
    private int age;
}

// 生成者が自動的に生成される。
public User(String name, int age) { 
    this.name = name;
    this.age = age;
}

生成者はメソッドと似た形を持つが、リターンタイプがなくクラス名と同じだ。

パラメータは、new演算子で生成者を呼び出す時、埋め込み値を生成者ブロック内部に伝達する役割をする。

二つの生成者を一緒に定義すれば、オブジェクト生成時に柔軟に活用できる。

Lombokを活用すれば、生成者を自動的に生成することができ、コードが簡潔になる。

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

@NoArgsConstructor // 基本生成者自動生成
@AllArgsConstructor // すべてのフィールドを受信する生成者の自動生成
public class Person {
    private String name;
    private int age;
}
区分 基本生成者 (@NoArgsConstructor) すべてのフィールドを受ける生成者 (@AllArgsConstructor)
パラメータ なし すべてのフィールドをパラメータとして受け入れる
初期化方式 明示的に値を割り当てない 生成時点でフィールドを初期化
オブジェクト生成方式 空オブジェクト生成後setterなどで値設定 オブジェクト生成時に値を指定して生成
使用目的 設定を後で実行 オブジェクト生成と同時にデータを設定

Discussion