こんにちは。しろと申します。
今日はlombokとJavaBeanにフォーカスした簡単なプログラムをご紹介します。
もくじ
JavaBeanの作成は地味に手間
Javaのプログラム経験がある方は、ほとんどの方がJavaBeanの作成経験があると思います。
lombokを導入していない場合、
- 手動でコーディング
- IDEの機能を利用した自動生成
といった感じでJavaBeanを作成していくと思います。
地味に手間な作業です。
僕もlombokに出会うまでは手間だなー、と思ってました。
lombokを知るまでは、JavaBean作成の度に、こんなことを思ってました。
- 地味な作業にあまり時間をかけたくない
- ここにかける時間をロジックの考案やコーディングにあてたい
こういった事を思っている方は必見です。
lombokを導入すれば、この手間から解放され、生産性が地味に向上します。
lombokとは
概要
繰り返し何度もコーディングする内容(ボイラープレートコード)をソースコードから除外する目的で作成されたライブラリです。
簡単にいうと、JavaBeanに宣言する、引数なしのコンストラクタや、Getter、Setterメソッドを、アノテーションを付与するだけでソースコードから除外できます。
方式
方式としては、コンパイル時に、ソースコードに付与されているlombokのアノテーションに基づき、その内容が実装された生成物(classファイル)が作成されます。
なので、もとのソースコードはすっきりした状態になるわけです。
文章で説明されてもいまいちピンとこないかもしれないので、実際に使ってみましょう!!
JavaBeanの規則
本題に入る前にJavaBeanのおさらいです。
恥ずかしながら、僕自身、JavaBeanを満たす条件がモヤっとしていました....
なので復習がてら、いろんなサイトを拝見させて頂いて、JavaBeanを満たす条件をまとめてみました。
- publicクラスであること。
- クラス名の末尾は「Bean」とする。
- java.io.Serializableを実装していること。※「serialVersionUID」も宣言すること。
- メンバ変数はprivateで宣言すること。
- 引数なしのコンストラクタを持つ。
- メンバ変数へのアクセサメソッド(Getter、Setterメソッド)を提供すること。
lombokを利用すると、上記の「5」と「6」の実装が不要となります。
lombokを使ってみよう
人を表すクラスを起点に、lombokを使用しない場合と、使用した場合とで見比べてみましょう。
以下、起点となるクラスのメンバ変数です。
- 名前 (name)
- 年齢 (age)
起点となるクラス
この時点では、規則の「1」~「4」を満たしていますが、「5」、「6」は満たしていません。
Eclipseのアウトラインも添えておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
package com.shirobetween.gradle.lombok.bean; import java.io.Serializable; /** * 人Bean. * @author shiro */ public class PersonBean implements Serializable { /** シリアルバージョンUID. */ private static final long serialVersionUID = 1234567890123456789L; /* * private member. */ /** 名前. */ private String name; /** 年齢. */ private int age; } |

lombok未使用のJavaBean
「起点となるクラス」をもとに、lombok未使用で、規則の「5」、「6」を追加で実装してJavaBeanの条件を満たしたソースコードです。
コンストラクタ1つ、アクセサメソッド4つが実装されるだけで見栄えが悪くなりますね....
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
package com.shirobetween.gradle.lombok.bean; import java.io.Serializable; /** * 人Bean. * @author shiro */ public class PersonBean implements Serializable { /** シリアルバージョンUID. */ private static final long serialVersionUID = 1234567890123456789L; /* * private member. */ /** 名前. */ private String name; /** 年齢. */ private int age; /* * constructor. */ /** * コンストラクタ. */ public PersonBean() { } /* * accessor method. */ public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } |

lombokを使用したJavaBean
最後に、「起点となるクラス」をもとに、lombokを使用して、規則の「5」、「6」を満たしてJavaBean化した場合のソースコードです。
アウトラインの内容についても、「lombok未使用のJavaBean」と並びが異なる点を除けば、全く同じ内容です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package com.shirobetween.gradle.lombok.bean; import java.io.Serializable; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; /** * 人Bean. * @author shiro */ @NoArgsConstructor @Getter @Setter public class PersonBean implements Serializable { /** シリアルバージョンUID. */ private static final long serialVersionUID = 1234567890123456789L; /* * private member. */ /** 名前. */ private String name; /** 年齢. */ private int age; } |

ソースコードを一見しただけでは分からないかもしれませんが、「5」、「6」を満たした実装は、クラスに付与している下記アノテーションによって実装されています。
- @NoArgsConstructor ・・・ 引数なしのコンストラクタが実装される。
- @Getter、@Setter ・・・ アクセサメソッド(Getter、Setter)が実装される。
こんな感じで、lombokを使用すると、アノテーションを付与するだけで、繰り返し何度もコーディングする内容が簡単実装できて、かつ、見栄えがすっきりします。
まとめ
lombokのメリット
- 繰り返し何度もコーディングする内容をコンパイル生成物に実装してくれる。
- ソースコードはすっきりして、見栄えがよくなる。
lombokのデメリット
- メンバ変数名を変更するとアクセサメソッド名の変更も行われるが、参照先の変更までは行われない。
補足
lombokにはここで紹介した以外にも、equalsメソッド、hashCodeメソッド生成用のアノテーションなど便利機能が多数あります。
気になる方はぜひ、ご自身でも調べてみて下さいね。
開発環境
参考までに今回の記事に載せたソースコードを作った環境を簡単ではありますが載せておきます。
すぐに試せると思うので使ったことがない方はぜひ体験してみて下さい。
開発環境
- Windows10 64bit
- Pleiades All in One Eclipse (Eclipse 2020)
- Java 11 (Eclipse同梱)
- Gradle 6.3 (Eclipse同梱)
- lombok 1.18.12 (Gradleで取得)
build.gradle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
plugins { id 'application' } application { // エントリポイントのクラス(読者様、ここは自環境のものに書き換えて下さいね). mainClassName = 'com.shirobetween.gradle.lombok.Main' } // リポジトリ. repositories { // jcenterからライブラリを取得. jcenter() } // 依存関係. dependencies { // コンパイルのみ. compileOnly 'org.projectlombok:lombok:1.18.12' } // エンコード. def defaultEncoding = 'UTF-8' // コンパイル. compileJava { options.encoding = defaultEncoding } |