Skip to content

Instantly share code, notes, and snippets.

@asufana
Last active January 17, 2018 16:01
Show Gist options
  • Save asufana/b4bb11ab1235b8fe7ca1 to your computer and use it in GitHub Desktop.
Save asufana/b4bb11ab1235b8fe7ca1 to your computer and use it in GitHub Desktop.
Lombok導入

Lombok導入

Lombokについては、第三回ありえる社内勉強会 「いわががのLombok」 を参照のこと。

インストール

サンプルコード

エンティティ

  • @Getterをクラス指定:すべてのフィールドにGetter補完
  • @Accessorsをクラス指定:アクセサをフィールド名と一致させる、Setterの戻り値をthisとする
  • @RequiredArgsConstructorをクラス指定 //コンストラクタを自動生成(finalフィールド、および@NonNullフィールド
  • @Setter:ミュータブルなフィールドのみに個別指定
import javax.persistence.*;
import lombok.*;
import lombok.experimental.*;
import base.domain.model.shared.*;
import domain.models.company.vo.*;

@Entity //JPA指定
@Table(name = "company") //JPA指定
@Getter //Getterアクセサをすべて補完
@Accessors(fluent = true) //アクセサをフィールド名と一致させる、Setterの戻り値をthisとする
@RequiredArgsConstructor //コンストラクタを自動生成
public class Company extends EntityModels<Company> {
    
    /** 会社コード */
    @Embedded
    @NonNull //null不可 -> コンストラクタ自動生成時のパラメータとなる
    private final CompanyCode companyCode;
    
    /** 会社名 */
    @Embedded
    @NonNull //null不可 -> コンストラクタ自動生成時のパラメータとなる
    @Setter //Setter補完
    private CompanyName companyName;
    
    @Override
    public boolean isSatisfied() {
        return true;
    }
}

バリューオブジェクト

  • @Valueをクラス指定:すべてのフィールドにGetter補完、toString補完、コンストラクタ補完
  • @Accessorsをクラス指定:アクセサをフィールド名と一致させる
  • @EqualsAndHashCodeをクラス指定:Equalsの上書きを禁止
import javax.persistence.*;
import lombok.*;
import lombok.Value;
import lombok.experimental.*;
import base.domain.model.shared.*;

/** 会社コード */
@Embeddable //JPA指定
@Value //Getter、toString、コンストラクタの補完
@Accessors(fluent = true) //アクセサをフィールド名と一致させる
@EqualsAndHashCode(callSuper = true) //Equalsの上書きを禁止
public class CompanyCode extends ValueObject<CompanyCode> {
    
    @Column(name = "company_code")
    private final Integer value;
    
    public CompanyCode(final Integer value) {
        this.value = value;
        validate();
    }
}

テストコード

    @Test
    public void testConstractor() {
        //Company生成
        assertThat(Company.count(), is(0L));
        val company = new Company(T.companyCode, T.companyName).save();

        //Company作成されていること
        assertThat(Company.count(), is(1L));
        
        //Warehouse作成
        assertThat(Warehouse.count(), is(0L));
        val warehouse = new Warehouse((Company) company,
                                      T.warehouseCode,
                                      T.warehouseName).save();

        //Warehouse作成されていること
        assertThat(Warehouse.count(), is(1L));
        
        //WarehouseからCompanyが取得できること
        assertThat(((Warehouse) warehouse).getCompany(), is(company));
    }

利用ルール

1. 常に利用するもの

@Value:Setter以外の補完が行われる(ValueObjectに最適!)

Immutableなオブジェクトにぴったり!

@Getter:Getterアクセサの配置

Beans形式で getXXX() アクセサが補完される。同じ名称で記述すれば上書きされる。

@Accessors(fluent=true)

  • デフォルトではBeans形式のアクセサ(getXXX, setXXX)が生成されるが、フィールド名と同じアクセサが用意される
  • Setterの戻り値がvoidからthisとなり、メソッドチェインを可能とする

see also: http://projectlombok.org/features/experimental/Accessors.html

val:推論型の利用

ダイヤモンド演算子(Java7)とか、普通右辺から書くから全くもって意味がない。将来推論型がコアに導入されたときにどうするんだろね。。?

とりあえず Lombok#val で楽しよう。

2. 場面に応じて利用するもの

@Setter:Setterアクセサの配置

更新要件があるときのみ付加する。

できるだけImmutableにしたいため、常にSetterアクセサを配置するようなことはしないこと。

3. 利用しないもの

@Data:Getter, Setter, equals, hashなどが配置される

Setterが常に付加されてしまう、また Entity や ValueObject での equals はメモリアドレス判定では困るので利用しないこと。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment