45
Lombok ハンズオン

Lombok ハンズオン

Embed Size (px)

Citation preview

Page 1: Lombok ハンズオン

Lombok ハンズオン

Page 2: Lombok ハンズオン

gishi_yama千歳市の大学で情報システムの研究開発に従事してますeラーニングシステムとか、地域の行政情報ポータルとか…

Apache Wicketのドキュメント翻訳札幌のJava エンジニアコミュニティ(Java Do)

おいしいもの大好きです

などをやってます

Page 3: Lombok ハンズオン

今日の内容

3

Page 4: Lombok ハンズオン

“Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, boilerplate-free, not-quite-java code.”

Project Lombok

4 https://github.com/rzwitserloot/lombok

LombokはJavaに’ハンドラ’を追加することで、Javaを気の利いた言語にするよ!ハンドラは・シンプルで・ボイラープレート(おきまりの書き方)をまぬがれる・Javaっぽくないコードにするビルドやコンパイルの方法を把握しているものだよ!

Page 5: Lombok ハンズオン

public  class  Cat  {      private  static  final  Logger  log  =  LoggerFactory.getLogger(Cat.class);      private  String  name;      private  String  voice;      private  int  age;  

   public  Cat()  {          this(null,  null,  0);      }  

 public  Cat(String  name,  String  voice,  int  age)  {          this.name  =  name;          this.voice  =  voice;          this.age  =  age;      }  

   public  void  setName(String  name)  {          this.name  =  name;    }  

 public  String  getName()  {        return  name;    }  

//  以下略…

毎回作成する おきまりのコード (ボイラープレート)

IDEである程度生成できるものもあるが、面倒なこともあるよ

Page 6: Lombok ハンズオン

たとえば• Getter/Setter

• equals, hashcode

• デフォルト/引数付き コンストラクタ

• ToString

• null check

• Builderパターン

• Logger

• 変数定義

• Immutable Object

• 遅延初期化

• etc…

Lombokはこういったものをアノテーションで省略・設定するよ

Page 7: Lombok ハンズオン

つまり、Lombokを使うと…定型コードが増えがちな部分

(データ・バリューオブジェクトやデザインパターン)の記載をアノテーションで簡略化できるよ

2009年から公開されており、日本語の情報もかなり充実しているよ

もし会場で使っている方がいればノウハウとか使ってる感をどしどし共有してほしいよ

7

Page 8: Lombok ハンズオン

Lombokのしくみ

8

Page 9: Lombok ハンズオン

public  class  Cat  {  

   private  String  name;  

   public  void  setName(String  name)  {          this.name  =  name;      }  

   public  String  getName()  {          return  name;      }  

}

import  lombok.Getter;  import  lombok.Setter;  

@Getter  @Setter  public  class  Cat  {      //  アノテーションをつけるとgetName(),  setName(String  name)  が実装される      private  String  name;  }

Lombokを使うと…

Page 10: Lombok ハンズオン

10

Page 11: Lombok ハンズオン
Page 12: Lombok ハンズオン

ハンズオン

12

Page 13: Lombok ハンズオン

進め方

13

src/main/java/javado/handsOn/vanilla の各クラスを開き、指示通りに書きかえていく(現状のLombokアノテーションをおおむね網羅しています)

src/main/java/javado/handsOn/useLombok のクラスが模範解答的なコード

src/main/java/sample は、実際に使うと…感の参考にしてください

Page 14: Lombok ハンズオン

60分なので いくつか抜粋して ハンズオンします!

14

Page 15: Lombok ハンズオン

1. Getter/Setter (HandsOn01)

15

Page 16: Lombok ハンズオン

この他、Getterのスレッドセーフな遅延初期化Getterなども可能(例:HandsOn14)

Getter/Setterが作成され利用できる!

Page 17: Lombok ハンズオン

2. Nullチェック (HandsOn02a)

17

Page 18: Lombok ハンズオン

この他、パラメータのnullチェックも可能(例:HandsOn02b)

Setterでnullチェック!

Page 19: Lombok ハンズオン

3. Log (HandsOn03)

19

Page 20: Lombok ハンズオン

logのクラス変数が暗黙的に作成される!

Page 21: Lombok ハンズオン

対応するLoggerの種類• @CommonsLog org.apache.commons.logging.Log

• @Logjava.util.logging.Logger

• @Log4jorg.apache.log4j.Logger

• @Log4j2 org.apache.logging.log4j.Logger

• @Slf4jorg.slf4j.Logger

• @XSlf4jorg.slf4j.ext.XLogger

21

すべて、private static final なクラス変数として初期化される

Page 22: Lombok ハンズオン

4. コンストラクタ (HandsOn04a)

22

Page 23: Lombok ハンズオン

この他、final(@NonNull)なフィールドのための引数つきコンストラクタや、デフォルトコンストラクタ、ファクトリメソッドも作成可能(例:HandsOn04b, HandsOn05)

フィールドの引数つきコンストラクタが 暗黙的に作成される!

Page 24: Lombok ハンズオン

5. toString (HandsOn06)

24

Page 25: Lombok ハンズオン

[main] INFO javado.handsOn.useLombok.HandsOn06 - HandsOn06(name=JavaDo, state=札幌)

toString()がフィールドの状態を文字列で返す

Page 26: Lombok ハンズオン

6. equals/hashCode (HandsOn07)

26

Page 27: Lombok ハンズオン

オブジェクトが値一致で比較できる (equals, hashCodeの中身が作成される)

Page 28: Lombok ハンズオン

7. FieldDefaults (HandsOn08)

28

Page 29: Lombok ハンズオン

アクセス修飾子が無いけれども private, final!

Page 30: Lombok ハンズオン

8. Value, Data (HandsOn10, HandsOn11)

30

Page 31: Lombok ハンズオン

@Value• バリューオブジェクト用のLombokアノテーションをまとめて付与ToStringEqualsAndHashCodeAllArgsConstructorFieldDefaults(makeFinal = true, level = PRIVATE) Getter

31

Page 32: Lombok ハンズオン

@Data• データオブジェクト用のLombokアノテーションをまとめて付与ToStringEqualsAndHashCodeRequiredArgsConstructor GetterSetter

32

Page 33: Lombok ハンズオン

9. finalなローカル変数 val (HandsOn12)

33

Page 34: Lombok ハンズオン

変数が参照するオブジェクト型で finalなローカル変数を作成! (TypeScriptのvalと同じ)下の場合、jugsの型はList<HandsOn12>

Page 35: Lombok ハンズオン

10. Builderパターン (HandsOn16)

35

Page 36: Lombok ハンズオン

@Builderをつけるだけで Builderパターンを実装可能! @SingularはCollection変数を1個ずつ追加できるようにする

Page 37: Lombok ハンズオン

そのほか

37

Page 38: Lombok ハンズオン

•@UtilityClassインスタンス化の抑制(HandsOn18)

•@Cleanup Closableなオブジェクトの自動close(HandsOn22)

•@Synchronized 並列処理用のsynchronizedブロック作成(HandsOn23)

•@Withimmutableオブジェクト用のwithメソッド作成(HandsOn13)

•@Accessorsgetter/setterのメソッドチェーン化、Fluentインターフェース的な名称設定(HandsOn11)

38

Page 39: Lombok ハンズオン

ところで

39

Page 40: Lombok ハンズオン

Lombokを 黒魔術という人も多い……

40

Page 41: Lombok ハンズオン

個人的に黒魔術感が強いと思うもの

41

• @ExtensionMethod変数の型をキーにしたstaticメソッドの変数への結合(HandsOn21)

• @Delegateメソッド処理のフィールドオブジェクトへの委譲(HandsOn17)

• @SneakyThrowsチェック例外の非チェック例外化(HandsOn15)

• @Helperヘルパークラスのインスタンス化省略(HandsOn19)

• onHoge=@__(@Piyo)アノテーションの付与(HandsOn20)

Page 42: Lombok ハンズオン

激辛より 中辛・辛口あたりで 制御して使った方が オイシイ!

42

Page 43: Lombok ハンズオン

備考

43

• Lombokアノテーションで生成されるコードと実際にプログラムされたコードが被ったときは、原則、プログラムされたコードが優先される

• lombok.experimental パッケージに存在するものは、公式見解にはテスト版(使えないわけではない)

• IDEとかみ合わせが悪い部分はどうしてもある(valが特にトラブる感)

Page 44: Lombok ハンズオン

まとめLombokを利用することで、Javaのボイラープレートなコードの簡略化(コード量の減少、記法統一によるミスの軽減)を狙える。

Beanなどのデータオブジェクトや、バリューオブジェクトの生成、デザインパターンの実装に効果を発揮しやすい。

IDEとの相性問題、一括変換機能などとのトレードオフは必要。

安定して使えるアノテーションからの導入がオススメ。黒魔術的な所や、混乱しそうな所は無理せずに。

44

Page 45: Lombok ハンズオン

次回予告

Spring Boot本とか JUnit実践入門本とか教科書にした

ハンズオンとか…?45