Lombok でできること確認します。( @Getter , @Setter )

2021年5月6日

この記事では Lombok の機能 @Getter @Setter の確認とその奥深さをお伝えしたいと思います。

Lombokの機能続きになります。
前回の記事はこちらを参照ください。

登場するクラスは前回同様HogeLombokクラスおよびメインクラスです。


package com.example.demo;
public class HogeLombok {
	private String fugaValue;
}

いつものヤツ

恒例のヤツです。前回は@Dataでアクセサを実現しましたが、ゲッター、セッターを
個別に指定することもできます。

Lombokでは@Getter, @Setterで実現しています。
@Dataはクラスに対して付与しましたが、@Getter, @Setterはメンバ変数に対して付与します。
このアノテーションただものではありません!
なんと可視性も指定できたり遅延処理をしたりすることができます!

まずは普通に実装してみます。

mainメソッドで使用する際もきちんとゲッター、セッターともにコード補完が有効になっています。
@Getter(@Setter)を素のまま使用すると「public」なゲッターとしてメソッドが生成されます。


package com.example.demo;

import lombok.Getter;
import lombok.Setter;

public class HogeLombok {
	// publicなゲッターとセッター
	@Getter @Setter
	private String fugaValue;
}


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 v = new HogeLombok();
		v.setFugaValue("getter, setterおーけー!");
		System.out.println(v.getFugaValue());
	}
}

実行

サクッと実行してみます。
問題ありませんね。

 

可視性を指定する

@Getter(@Setter)の引数に「AccessLevel」を使用すると生成するメソッドに対して可視性を指定することができます。
例えばAccessLevel.PRIVATEを指定すると・・・


package com.example.demo;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;

public class HogeLombok {
	// privateなゲッター
	@Getter(AccessLevel.PRIVATE) @Setter
	private String fugaValue;
}


なんとコンパイルエラーで怒られてしまいました😣

ゲッターはpublicにしたいけどセッターは継承関係のあるクラスのみ、パッケージ内のクラスのみなど
可視性の細やかな設定が可能です。不用意に公開範囲を広げるべきではありませんからね。

遅延処理

@Getterにlazyを使用すると、値が使用されるまで処理を保留にする方法があります。
ただしlazyは定数(final)でしか使用できないようです。


package com.example.demo;

import lombok.Getter;

public class HogeLombok {
	
	@Getter
	private final String fugaValue01 = create("インスタンス生成時、即時実行!");
	
	@Getter(lazy=true)
	private final String fugaValue02 = create("この値が使用されるまで処理は待つ!");
	
	private String create(String v) {
		System.out.println(v);
		return "----";
	}
}


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 v = new HogeLombok();
		System.out.println("メイン処理ですよ~");
		System.out.println(v.getFugaValue02());
	}
}

確認

それでは実行してみましょう。

少しわかりにくいですが・・・
定数は通常インスタンス生成時に値が格納されます。
なのでHogeLombokのインスタンス生成処理でfugaValue01の右オペランドがすぐに実行され、結果がfugaValue01に格納されたんですね。
fugaValue02も同様・・・と思いますがfugaValue02にはlayzyが指定されているため、fugaValue02の変数が参照されるまで処理が保留状態となっています。

		System.out.println(v.getFugaValue02());

で初めてfugaValue02の値が参照されるので「メイン処理ですよ~」→「この値が使用されるまで処理は待つ!」の順に出力されたんですね。

 

奥が深い

@Getter, @Setterは非常によく使用されるだけあって細部にまでこだわっている印象です。
ごく単純なアクセサだけの実現であればそこまで驚きませんでしたが本当によくできていると感心します。