Lombok でできること確認します。(val, @NonNull, @Cleanup)
この記事では 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歩譲ってもう少し優しそうなアイコンにしてほしかったです(笑
ディスカッション
コメント一覧
まだ、コメントがありません