Upload
hiroto-yamakawa
View
470
Download
2
Embed Size (px)
Citation preview
Lombok ハンズオン
gishi_yama千歳市の大学で情報システムの研究開発に従事してますeラーニングシステムとか、地域の行政情報ポータルとか…
Apache Wicketのドキュメント翻訳札幌のJava エンジニアコミュニティ(Java Do)
おいしいもの大好きです
などをやってます
今日の内容
3
“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っぽくないコードにするビルドやコンパイルの方法を把握しているものだよ!
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である程度生成できるものもあるが、面倒なこともあるよ
たとえば• Getter/Setter
• equals, hashcode
• デフォルト/引数付き コンストラクタ
• ToString
• null check
• Builderパターン
• Logger
• 変数定義
• Immutable Object
• 遅延初期化
• etc…
Lombokはこういったものをアノテーションで省略・設定するよ
つまり、Lombokを使うと…定型コードが増えがちな部分
(データ・バリューオブジェクトやデザインパターン)の記載をアノテーションで簡略化できるよ
2009年から公開されており、日本語の情報もかなり充実しているよ
もし会場で使っている方がいればノウハウとか使ってる感をどしどし共有してほしいよ
7
Lombokのしくみ
8
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を使うと…
10
ハンズオン
12
進め方
13
src/main/java/javado/handsOn/vanilla の各クラスを開き、指示通りに書きかえていく(現状のLombokアノテーションをおおむね網羅しています)
src/main/java/javado/handsOn/useLombok のクラスが模範解答的なコード
src/main/java/sample は、実際に使うと…感の参考にしてください
60分なので いくつか抜粋して ハンズオンします!
14
1. Getter/Setter (HandsOn01)
15
この他、Getterのスレッドセーフな遅延初期化Getterなども可能(例:HandsOn14)
Getter/Setterが作成され利用できる!
2. Nullチェック (HandsOn02a)
17
この他、パラメータのnullチェックも可能(例:HandsOn02b)
Setterでnullチェック!
3. Log (HandsOn03)
19
logのクラス変数が暗黙的に作成される!
対応する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 なクラス変数として初期化される
4. コンストラクタ (HandsOn04a)
22
この他、final(@NonNull)なフィールドのための引数つきコンストラクタや、デフォルトコンストラクタ、ファクトリメソッドも作成可能(例:HandsOn04b, HandsOn05)
フィールドの引数つきコンストラクタが 暗黙的に作成される!
5. toString (HandsOn06)
24
[main] INFO javado.handsOn.useLombok.HandsOn06 - HandsOn06(name=JavaDo, state=札幌)
toString()がフィールドの状態を文字列で返す
6. equals/hashCode (HandsOn07)
26
オブジェクトが値一致で比較できる (equals, hashCodeの中身が作成される)
7. FieldDefaults (HandsOn08)
28
アクセス修飾子が無いけれども private, final!
8. Value, Data (HandsOn10, HandsOn11)
30
@Value• バリューオブジェクト用のLombokアノテーションをまとめて付与ToStringEqualsAndHashCodeAllArgsConstructorFieldDefaults(makeFinal = true, level = PRIVATE) Getter
31
@Data• データオブジェクト用のLombokアノテーションをまとめて付与ToStringEqualsAndHashCodeRequiredArgsConstructor GetterSetter
32
9. finalなローカル変数 val (HandsOn12)
33
変数が参照するオブジェクト型で finalなローカル変数を作成! (TypeScriptのvalと同じ)下の場合、jugsの型はList<HandsOn12>
10. Builderパターン (HandsOn16)
35
@Builderをつけるだけで Builderパターンを実装可能! @SingularはCollection変数を1個ずつ追加できるようにする
そのほか
37
•@UtilityClassインスタンス化の抑制(HandsOn18)
•@Cleanup Closableなオブジェクトの自動close(HandsOn22)
•@Synchronized 並列処理用のsynchronizedブロック作成(HandsOn23)
•@Withimmutableオブジェクト用のwithメソッド作成(HandsOn13)
•@Accessorsgetter/setterのメソッドチェーン化、Fluentインターフェース的な名称設定(HandsOn11)
38
ところで
39
Lombokを 黒魔術という人も多い……
40
個人的に黒魔術感が強いと思うもの
41
• @ExtensionMethod変数の型をキーにしたstaticメソッドの変数への結合(HandsOn21)
• @Delegateメソッド処理のフィールドオブジェクトへの委譲(HandsOn17)
• @SneakyThrowsチェック例外の非チェック例外化(HandsOn15)
• @Helperヘルパークラスのインスタンス化省略(HandsOn19)
• onHoge=@__(@Piyo)アノテーションの付与(HandsOn20)
激辛より 中辛・辛口あたりで 制御して使った方が オイシイ!
42
備考
43
• Lombokアノテーションで生成されるコードと実際にプログラムされたコードが被ったときは、原則、プログラムされたコードが優先される
• lombok.experimental パッケージに存在するものは、公式見解にはテスト版(使えないわけではない)
• IDEとかみ合わせが悪い部分はどうしてもある(valが特にトラブる感)
まとめLombokを利用することで、Javaのボイラープレートなコードの簡略化(コード量の減少、記法統一によるミスの軽減)を狙える。
Beanなどのデータオブジェクトや、バリューオブジェクトの生成、デザインパターンの実装に効果を発揮しやすい。
IDEとの相性問題、一括変換機能などとのトレードオフは必要。
安定して使えるアノテーションからの導入がオススメ。黒魔術的な所や、混乱しそうな所は無理せずに。
44
次回予告
Spring Boot本とか JUnit実践入門本とか教科書にした
ハンズオンとか…?45