Lombok でできること確認します。( @RequiredArgsConstructor )と 定数

2021年5月6日

この記事は前回に引き続きLombok の機能を確認します。
今回は @RequiredArgsConstructor というアノテーションについてです。
また 定数 についての少し興味深い考察も行います。

また寄り道からスタートしたいと思います。

1度代入したら二度と代入できない変数!?

Javaでは1度代入したら二度と代入できないくなる変数が存在します。
この変数は「定数」と呼ばれています。

定数は値を変更されては困るときや初期化時に決めた値を自身が消滅するときまで保持したいときに使用します。

いろんな代入法

この定数がどのように使えるのか見てみます。

package com.example.demo;

public class HogeLombok {
	// 静的な定数
	public static final int NOT_CHANGE_STATIC = 200;
	// インスタンス定数
	private final int notChangeInstance = 100;	
}

これが一番ありきたりな定数です。
publicな静的な変数はお仕事でもよく目にします。
システム全体で使用したい値を定義するときでしょうかね。

定数は初期化しないと怒られてしまいます。

ちゃんと宣言と同時に値を代入してあげましょう。

興味深い例です。この例ではnotChange01がコンパイルエラーではなく、コンストラクタがコンパイルエラーとなっています。
こういったひっかけ問題はJava Bronzeではよく見かけます。「どの行でコンパイルエラーとなるのか」よく確認しておきましょう。
この解決法は

先ほど紹介した宣言と同時に値を代入で解決できます。
もうひとつは

コンストラクタで値を代入しても問題ありません。
しかし

通常のメソッドでは定数に値を代入することはできません。
コンストラクタはインスタンス生成時に一度だけ呼び出されることが保証されています。
つまり定数への値代入も一度だけした行いません。
ただし、以下のような例はコンストラクタと言えども代入はできません。

宣言時と同時に代入を行っているパターンです。

では以下の場合はどうでしょう?

package com.example.demo;

public class HogeLombok {
	
	private final int notChange01;
	
	public HogeLombok() {
		this(10);
		notChange01 = 200;
	}
	
	public HogeLombok(int v) {
		notChange01 = v;
	}
}

別のコンストラクタ呼び出しを行ったコンストラクタの例です。

こんな感じになります。
「再代入を行おうとした行」でコンパイルエラーとなると覚えればよいでしょう。
なかなか複雑ですね😅

 

寄り道はここまで!

引数ありのコンストラクタを自動生成

以下のようにいくつも定数があり、コンストラクタで初期化しなければならない・・・
大変ですよね?
単純にコンストラクタ内部でリテラルを代入するだけならまぁ・・・とは思いますが引数で受け取った値を各定数に代入するとなると可読性も低くなってしまいます。

package com.example.demo;

public class HogeLombok {
	
	private final int notChange01;
	private final int notChange02;
	private final int notChange03;
	private final int notChange04;
	private final int notChange05;
}

@RequiredArgsConstructor

そこで登場するのが Lombok の @RequiredArgsConstructor です。
このアノテーションは finalで修飾されたフィールドを対象に、引数を取るのコンストラクタを自動生成できます。

使い方もいつも通り簡単です。 @RequiredArgsConstructor をクラスに付与するだけです。

package com.example.demo;

import lombok.RequiredArgsConstructor;
import lombok.ToString;

@ToString
@RequiredArgsConstructor
public class HogeLombok {
	
	private final int notChange01;
	private final int notChange02;
	private final int notChange03;
	private final int notChange04;
	private final int notChange05;
}

このコードでは確認のために @ToString を付与しました。

呼び出し側の実装を見てみましょう。

ちゃんと5つの引数を持つコンストラクタが候補で表示されましたね!

このまま実装を続けます。

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(1, 2, 3, 4, 5);
		
		System.out.println(v01);
	}
}

確認

それでは実行してみます。

しっかり値が代入されたことを確認できましたね。

 

まとめ

Lombok の @RequiredArgsConstructor について確認を行いした。
お仕事の分野でもこの 定数 はとてもよく見かけます。
そしてJava Bronzeの試験でもよく問われる問題となります。
よく確認しておくほうがよいですよ🙂

今日はここまで!