多数のプロパティを持つクラスを生成するときに、Builderが有用だと思っているのですが、普通に書くとそれなりにコード書く必要があります。そこでLombokの@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); // Builder使うことによって、どのプロパティに対しての値なのかわかりやすくなる Customer customer2 = Customer.builder() .firstName("Taro") .lastName("Urashima") .mailAddress("ura@exmple.com") .telephone("111-111-1111") .build(); System.out.println(customer2); } } @Builder @ToString class Customer { private String firstName; private String lastName; private String mailAddress; private String telephone; }
上記によって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.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 + ")"; } }