Lombokの使い方
プロジェクトにLombokをインストールしてgetterやsetterを省略します。
getterやsetter、コンストラクタなどのロジックと関係ないコードをボイラープレートコードと言います。Lombokはそれをアノテーション付加することにより生成してくれます。
Lombokはこちらからダウンロードします。
lombok.jarがダウンロードされるのでダブルクリックするとIDEを検出してくれます。
IDEにチェックを入れ、「Install / Update」をクリックします。
eclipse.iniやsts.iniが修正(追加)されます。
mavenを使用している場合、pom.xmlに以下を追加します。
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.14.0</version> <scope>provided</scope> </dependency>
それ以外の場合は、Eclipse(STS)を再起動して使いたいプロジェクトを右クリックして「プロパティー」を選択します。
ライブラリタブを選んで「外部Jar」からlombok.jarを選んで完了です。
lombok.Data
@Dataアノテーションを使用するとgetter,setterメソッドを省略することができます。
package com.confrage.domain; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class Customer{ private Integer id; private String firstname; private String lastname; }
アウトラインビューを見るとgetter,setterが表示されているのがわかります。
private finalとするとsetterメソッドは生成されないようになっていて便利です。
lombok.AllArgsConstructor
@AllArgsConstructorアノテーションを使用すると引数ありコンストラクタが生成されるようになります。この時、引数なしコンストラクタは生成されなくなります。
また、enumで@AllArgsConstructorを使用すると自動的にprivateなコンストラクタを生成してくれます。
アクセスレベルを指定したい場合は、アノテーションで指定可能です。未指定の場合はpublicになります。
@AllArgsConstructor(access = AccessLevel.PRIVATE);
lombok.extern.slf4j.Slf4j
lombokではSlf4jという便利なロガーが用意されています。
@Slf4jというアノテーションをクラスにつければlogが使えます。
package jp.co.confrage; import java.util.Date; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import lombok.extern.slf4j.Slf4j; @RestController @Slf4j public class DemoController { @Autowired EmployeeRepository repository; @Autowired DemoService service; @RequestMapping(value = "/getXX", method = RequestMethod.GET) public List<Employee> index() { log.info("開始{}",new Date()); // ここでログ出力 return service.selectEmployee(); } }
こんな感じで出力されます。
開始Tue Jan 29 21:20:49 GMT+09:00 2019
{}はプレースホルダーみたいなものです。いくつでも{}を指定でき、そのプレースホルダーの分だけ引数が増えます。
lombok.experimental.Accessors
lombokにはAccessorsというアノテーションもあって、これはエンティティにつけます。
エンティティに@Accessors(chain = true)
とつけると、セッターのメソッドチェーンが可能になります。
entity.setId(1).setName("takahashi");
こんなイメージです。
エンティティに@Accessors(fluent = true)とつけると、プロパティ名がそのままメソッド名になりますし、メソッドチェーンも有効になるようです。
以下、エンティティです。
package jp.co.confrage; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import lombok.Data; import lombok.experimental.Accessors; @Data @Entity @Table(name="employee_master") @Accessors(fluent = true) public class Employee { @Id @Column(name="empno") @GeneratedValue(strategy=GenerationType.IDENTITY) private Long empno; @Column(name="empname") private String empname; }
このエンティティの場合、以下のようなことが可能になります。getEmpnoではなく、empnoというメソッドに変わります。メソッドチェーンも可能です。
emp.empno(Long.valueOf(1)).empno();
引数があればセッターですし、なければゲッターです。
@Dataでファクトリメソッドを作成する
@Data(staticConstructor="of")
というように記述すると、staticメソッドofが作成されます。
import lombok.Data; @Data(staticConstructor="of") public class StaticConstructor { private String name; }
上記のように記述するだけでメソッドが生成されます。
Eclipseのアウトラインビューで生成されたメソッドを確認します。
使う側のクラスでは以下のようにofメソッドでインスタンス生成が可能です。
StaticConstructor sc = StaticConstructor.of(); sc.getName();
lombok.Builderでビルダーパターンを実装する
@Builderを使えばビルダーパターンが実装されます。
import lombok.Builder; import lombok.Value; @Builder @Value public class SampleBuilder { private String name; private Integer age; }
lombok.Value
@Valueを使用すると以下3つが生成されます。
- getterが用意される
- final classになる
- private finalフィールドになる
-
equals(),hashCode(),toString()が@Overrideアノテーションが付与されて用意される
この@Valueと@Builderと併用してVOクラスを生成します。
呼び出し側は以下のように記述します。
SampleBuilder sb = SampleBuilder.builder().age(20).name("takahashi").build(); sb.getAge();
lombok.with
lombok.Valueと似ている@withがあります。クラスに付与できますし、フィールドに付与することもできます。
import lombok.Value; import lombok.With; @With @Value public class SampleEntity { private Long id; }
フィールドに対してwithId()メソッドが追加されます。
public SampleEntity withId(final Long id) { return this.id == id ? this : new SampleEntity(id); }
lombok.Generated
@Generatedアノテーションをクラスに付与するとJacocoのカバレッジレポート対象外となります。
getter,setterを上書きする
@Dataなどを使用してgetter,setterを生成して、一部のプロパティだけgetter,setterだけ特別な処理をさせたい場合、getter,setterを上書きすることができます。
getter,setterを記述するとlombokで自動生成されたgetter,setterを上書きしてくれます。特に難しい設定は不要です。
lombok.valを使う
lombok.valをインポートすると、val型を定義することができます。
val型の特徴として以下があります。
- 型推論される
- 定数扱いになる(final修飾子がつく)
コード例です。
package jp.co.confrage.controller; import org.springframework.stereotype.Controller; import jp.co.confrage.repository.UserRepository; import lombok.RequiredArgsConstructor; import lombok.val; @Controller @RequiredArgsConstructor public class UserController { private final UserRepository repository; public void select() { val list = repository.findByPk(); // listは定数扱い for(String l: list) { System.out.println(l); } } }
Kotlinからボイラープレートコードは呼び出せない
Kotlinからjavaコードを呼び出すことができるのですが、lombokのボイラープレートコードを呼び出すことができない問題があるようです。
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント