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));
}
Immutableなオブジェクトにぴったり!
Beans形式で getXXX() アクセサが補完される。同じ名称で記述すれば上書きされる。
- デフォルトではBeans形式のアクセサ(getXXX, setXXX)が生成されるが、フィールド名と同じアクセサが用意される
- Setterの戻り値がvoidからthisとなり、メソッドチェインを可能とする
see also: http://projectlombok.org/features/experimental/Accessors.html
ダイヤモンド演算子(Java7)とか、普通右辺から書くから全くもって意味がない。将来推論型がコアに導入されたときにどうするんだろね。。?
とりあえず Lombok#val で楽しよう。
更新要件があるときのみ付加する。
できるだけImmutableにしたいため、常にSetterアクセサを配置するようなことはしないこと。
Setterが常に付加されてしまう、また Entity や ValueObject での equals はメモリアドレス判定では困るので利用しないこと。