Lombokの使い方

Lombokの使い方

プロジェクトにLombokをインストールしてgetterやsetterを省略します。

getterやsetter、コンストラクタなどのロジックと関係ないコードをボイラープレートコードと言います。Lombokはそれをアノテーション付加することにより生成してくれます。

Lombokはこちらからダウンロードします。

lombok.jarがダウンロードされるのでダブルクリックするとIDEを検出してくれます。

Lombokを使う

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を使う

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のアウトラインビューで生成されたメソッドを確認します。

Lombokを使う

使う側のクラスでは以下のように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);
}

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のボイラープレートコードを呼び出すことができない問題があるようです。

コメント

タイトルとURLをコピーしました