マニュアル: Value Object

投稿日: 更新日: Java オブジェクト指向プログラミング ドメイン駆動設計

作り方

まとめ中です。

import java.util.Objects;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

public final class {{ class_name }} {
  @NonNull private final {{ field_type }} {{ field_name }};

  public static {{ class_name }} of({{ field_type }} {{ field_name }}) {
    return new {{ class_name }}({{ field_name }});
  }

  private {{ class_name }}({{ field_type }} {{ field_name }}) {
    String checked = Objects.requireNonNull({{ field_name }}, "{{ field_name }}がnullです。");

    // TODO: 引数の中身のチェックを追加
    this.{{ field_name }} = checked;
  }

  @NonNull
  public {{ field_type }} value() {
    return this.{{ field_name }};
  }

  @Override
  public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj);
  }

  @Override
  public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
  }

  /**
   * このオブジェクトの簡潔な説明を返します。
   * ただし、この表現は明記せず、変更されることがあります。
   */
  @Override
  public String toString() {
    return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
  }
}

ポイント

テスト

equals()のテストには、EqualsVerifierを使うと良さそうです。

処理を追加する場合


  1. 例: java.time.Year#parse() [return]
  2. Effective JavaではnullのときはNullPointerExceptionを投げると良いとされてますが、「引数間違い」という意図を分かりやすくするためにIllegalArgumentExceptionを好んでます。 [return]

外部サイト



ページトップへ戻る