前回の記事の続きで。
@Builder(toBuilder = true)
とすると、オブジェクトからBuilderを生成できます。
どういうときに使えるかというと、オブジェクトの複製を作成して、一部のプロパティのみ変えたいといった場合です。
package com.example.lombok; import lombok.Builder; import lombok.ToString; public class BuilderExample { public static void main(String[] args) { Customer customer1 = new Customer("Taro", "Urashima", "ura@exmple.com", "111-111-1111"); System.out.println(customer1); Customer customer2 = customer1.toBuilder() .lastName("Yamada") .build(); System.out.println(customer2); } } @Builder(toBuilder = true) @ToString class Customer { private String firstName; private String lastName; private String mailAddress; private String telephone; }
実行結果は下記の通りです。lastName
だけが異なるオブジェクトが生成されます。
Customer(firstName=Taro, lastName=Urashima, mailAddress=ura@exmple.com, telephone=111-111-1111) Customer(firstName=Taro, lastName=Yamada, mailAddress=ura@exmple.com, telephone=111-111-1111)
Lombokで生成されるのは、下記のようなコードになります。(delombokで確認)
class Customer { private String firstName; private String lastName; private String mailAddress; private String telephone; @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") Customer(final String firstName, final String lastName, final String mailAddress, final String telephone) { this.firstName = firstName; this.lastName = lastName; this.mailAddress = mailAddress; this.telephone = telephone; } @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") public static class CustomerBuilder { @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") private String firstName; @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") private String lastName; @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") private String mailAddress; @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") private String telephone; @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") CustomerBuilder() { } @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") public CustomerBuilder firstName(final String firstName) { this.firstName = firstName; return this; } @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") public CustomerBuilder lastName(final String lastName) { this.lastName = lastName; return this; } @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") public CustomerBuilder mailAddress(final String mailAddress) { this.mailAddress = mailAddress; return this; } @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") public CustomerBuilder telephone(final String telephone) { this.telephone = telephone; return this; } @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") public Customer build() { return new Customer(firstName, lastName, mailAddress, telephone); } @java.lang.Override @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") public java.lang.String toString() { return "Customer.CustomerBuilder(firstName=" + this.firstName + ", lastName=" + this.lastName + ", mailAddress=" + this.mailAddress + ", telephone=" + this.telephone + ")"; } } @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") public static CustomerBuilder builder() { return new CustomerBuilder(); } @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") public CustomerBuilder toBuilder() { return new CustomerBuilder().firstName(this.firstName).lastName(this.lastName).mailAddress(this.mailAddress).telephone(this.telephone); } @java.lang.Override @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") public java.lang.String toString() { return "Customer(firstName=" + this.firstName + ", lastName=" + this.lastName + ", mailAddress=" + this.mailAddress + ", telephone=" + this.telephone + ")"; } }