Lombok でできること確認します。(val, @NonNull, @Cleanup)

2021年5月6日

この記事では Lombok の機能 val @NonNull @Cleanupの確認を行います。

STSでLombokの威力を試してみましたでLombokがどれほどすごいのかご理解いただけたと思います。

しかしLombokにはまだまだたくさんの機能が備わっているようです。
こちらのサイトでいろいろ参考にさせていただきました。

newする対象のクラスとして、前回登場したHogeLombokクラスを使用します。


package com.example.demo;

import lombok.Data;

// これが「アクセサを自動生成する」というアノテーション
@Data
public class HogeLombok {
	private String fugaValue;
}

finalとなる変数

var ではありません。
使い方はvarのように型推論を行いかつfinalで修飾されるようです。
定数を扱う際に使用できます。

使用方法はこんな感じです。(このコードはコンパイルエラーです。)
lombok.valをimportしておきましょう。


package com.example.demo;

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

import lombok.val;

@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
		
		// これはvar
		var v = new HogeLombok();
		v = new HogeLombok();		// 再代入も問題なし
		
		// xはfinal修飾されているので再代入はコンパイルエラーとなる
		val x = new HogeLombok();
		x = new HogeLombok();
	}
}

 

 

nullを自動でチェックしてくれる

これはすごいです。私はこのnullに何度も泣かされました😪
お仕事としてコーディングしているとnull関係のトラブルはトラウマになりますよね。
昨今はNullセーフ(Null安全)の言語が多くなってきているようでうれしい限りです。
と余談でした。
LombokではNonNullというアノテーションで自動nullチェックを実装しています。


package com.example.demo;

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

import lombok.NonNull;

@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
		
		
		var v = new HogeLombok();
		v = new HogeLombok();	
		v.setFugaValue("問題なし");
		
		System.out.println(getValue(v));
		
		// 実行時例外
		v = null;
		System.out.println(getValue(v));
	}
	
	public static String getValue(@NonNull HogeLombok hoge) {
		return hoge.getFugaValue();
	}
}

実行結果です。
ちゃんとnullの検査をしていますね。

 

終わった後のお掃除

スコープを抜けるときに自動でcloseメソッドを呼び出してくれる機能があります。
Lombokでは@Cleanupを使うようです。

引数で任意のメソッドを呼び出すことも可能なようです。

closeメソッドを実装しないと怒ってくれます。
なんて賢いんだ・・・
今回の場合、HogeLombokをnewしていますので、closeメソッドはHogeLombokのクラスに記述します。
@Cleanupは


package com.example.demo;

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

import lombok.Cleanup;


@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
		
		@Cleanup HogeLombok v = new HogeLombok();
		
	}
}

package com.example.demo;

import lombok.Data;

// これが「アクセサを自動生成する」というアノテーション
@Data
public class HogeLombok {
	private String fugaValue;
	
	public void close() {
		System.out.println("呼び出されました。");
	}
}

 

実行結果です。
ちゃんとcloseメソッドを呼び出しました。
closableインタフェースの代用になるのでしょうか?
いや、この機能はスコープを抜ける際に自動的に指定したメソッドを呼び出すので
こちらのほうが使い勝手はよさそうですね。

 

メソッドを指定することもできます。


package com.example.demo;

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

import lombok.Cleanup;


@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
		
		// 呼び出すメソッドを指定することも可能
		@Cleanup("最後の処理") HogeLombok v = new HogeLombok();
		
	}
}

package com.example.demo;

import lombok.Data;

// これが「アクセサを自動生成する」というアノテーション
@Data
public class HogeLombok {
	private String fugaValue;
	
	public void close() {
		System.out.println("呼び出されました。");
	}
	public void 最後の処理() {
		System.out.println("お別れの処理!");
	}
}

パワフル!

 

まだまだ気になる機能がたくさんありますね!

余談

しかし・・・

なぜ唐辛子にしたんでしょう・・・。
100歩譲ってもう少し優しそうなアイコンにしてほしかったです(笑