Lombok でできること確認します。( @NoArgsConstructor )

2021年5月6日

先日の投稿に引き続き、今回は Lombok の @NoArgsConstructor について確認しようと思います。

コンストラクタ

Javaではインスタンス化する際、必ず呼び出すメソッドがあります。
それが「コンストラクタ」というメソッドになります。
コンストラクタではインスタンス化する際に必要となる初期化を行います。
「特に処理することなんてない!」と思っても必ず呼び出す必要があります。
このコンストラクタの処理で派生元の初期化(コンストラクタ呼び出し)も行われれます。

まずはおさらい的にデフォルトコンストラクタを確認しておきましょう。

見えないコンストラクタ

例えば以下の例を見てください。

package com.example.demo;

public class HogeLombok {
	private int age;
	private String name;
	private String hobby;
}

このようなクラスがあったときに

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
		
		// インスタンス化!
		HogeLombok v01 = new HogeLombok();
	}
}

という風に呼び出していましたよね。
どこでコンストラクタメソッド呼び出しをしているのかわかりますか?

コンストラクタ呼び出し

この部分ですね。
しかしHogeLombokクラスを見てもこのようなメソッドは定義しませんでしたよね。

デフォルトコンストラクタ

実はJavaではクラスに明示的にコンストラクタ(今回はHogeLombokメソッド)を実装しなかった場合、
デフォルトコンストラクタがコンパイル時に自動的に投入される仕組みになっています。

挿入イメージはこんな感じです。

package com.example.demo;

public class HogeLombok {
	private int age;
	private String name;
	private String hobby;
	
	// デフォルトコンストラクタ挿入イメージ
	public HogeLombok() {}
}

デフォルトコンストラクタは引数無し・処理なし(厳密にはちょっと違う)の特殊なメソッドのことです。
コンストラクタは戻り値も記述しません。(voidでもない)
デフォルトコンストラクタも同様に戻り値を記述しません。

おさらいはここまで。

コンストラクタを明示的に実装

コンストラクタを明示的に実装してみましょう。
ちょっと色を加えて、引数の定義もしちゃいましょう。
特殊なメソッドとはいえ、原型はメソッドです。

普通のメソッド同様に当然引数も記述できます。

package com.example.demo;

public class HogeLombok {
	private int age;
	private String name;
	private String hobby;
	
	// デフォルトコンストラクタ挿入イメージ
	public HogeLombok(int age) {
		this.age = age;
	}
}

このコードは全く問題ありません。
しかしこのクラスをインスタンス化しようとしているクラスを見てください。

コンパイルエラーになっていますね。
これはHogeLombokをインスタンス化する際、引数を取らないコンストラクタを呼び出そうとしているからです。

「さっきは問題なかった・・・デフォルトコンストラクタはどこいった???」

明示的にコンストラクタを定義する前は自動的に挿入されたデフォルトコンストラクタが存在していました。
なので上記クラスは問題なく引数無しのコンストラクタを呼び出せました。(デフォルトコンストラクタは引数無し・処理なしのコンストラクタでしたね)
実は明示的にコンストラクタを実装した場合、デフォルトコンストラクタは作成されないというJavaの仕様があります。
なので今回はコンパイルエラーとなったわけですね。

※ここはJava Bronzeレベルの難易度なのでよく理解しておくほうが良いですよ

話を戻し @NoArgsConstructor

さて、Lombokではこの引数無しのコンストラクタを生成する機能があります。

それが @NoArgsConstructor アノテーションです。
このアノテーションをHogeLombokクラスに付与すれば引数無しのコンストラクタを自動的に生成することができます。

package com.example.demo;

import lombok.NoArgsConstructor;

@NoArgsConstructor
public class HogeLombok {
	private int age;
	private String name;
	private String hobby;
	
	// デフォルトコンストラクタ挿入イメージ
	public HogeLombok(int age) {
		this.age = age;
	}
}

この実装を終えると・・・

コンパイルエラーの波線が消えましたね!
もちろん実行もできます。

 

まとめ

Lombok の @NoArgsConstructor について確認しました。
使いどころについてですが、私は頭がよくないので思いつきません。
引数を取らないコンストラクタを作成するだけなら明示的に実装してもコスト差はなさそうですけれども。

しかしこのような機能が実装されているということが必ずどこか使いどころがあるはずです。
なにかオプション等ありそうな気もします。
精進せねば・・😣

今日はここまで!