読者です 読者をやめる 読者になる 読者になる

Java: ステータスをあらわす Enum に isXxx() メソッドを持つのが好き

Java

こんなEnum

public enum InsideHead {
  JOY,
  SADNESS,
  FEAR
}

こんなクラスで使うとして。

@Accessors(fluent = true)
@Getter
@ToString
@EqualsAndHashCode
public class Bufferings {

  private InsideHead insideHead = InsideHead.JOY;

  public void eatChocolate() {
    this.setInsideHead(InsideHead.JOY);
  }

  public void workOvertime() {
    this.setInsideHead(InsideHead.SADNESS);
  }

  public void seeSourceCodeWithNoTest() {
    this.setInsideHead(InsideHead.FEAR);
  }

  private void setInsideHead(InsideHead anInsideHead) {
    if (anInsideHead == null) {
      throw new IllegalArgumentException("The insideHead must be provided.");
    }
    this.insideHead = anInsideHead;
  }

}

こんな感に使う

class BufferingsSpec extends Specification {

  def "InsideHead"() {
    when:
      Bufferings bufferings = new Bufferings()
    then:
      bufferings.insideHead() == InsideHead.JOY

    when:
      bufferings.seeSourceCodeWithNoTest();
    then:
      bufferings.insideHead() == InsideHead.FEAR

    when:
      bufferings.workOvertime();
    then:
      bufferings.insideHead() == InsideHead.SADNESS

    when:
      bufferings.eatChocolate();
    then:
      bufferings.insideHead() == InsideHead.JOY
  }

}

なら、isXxx() メソッドを持つほうが好き。

public enum InsideHead {
  JOY {
    public boolean isJoy() {
      return true;
    }
  },

  SADNESS {
    public boolean isSadness() {
      return true;
    }
  },

  FEAR {
    public boolean isFear() {
      return true;
    }
  };

  public boolean isJoy() {
    return false;
  }

  public boolean isSadness() {
    return false;
  }

  public boolean isFear() {
    return false;
  }

}

そしたらこんな風に使える

class BufferingsSpec extends Specification {

  def "InsideHead"() {
    when:
      Bufferings bufferings = new Bufferings()
    then:
      bufferings.insideHead().isJoy()

    when:
      bufferings.seeSourceCodeWithNoTest();
    then:
      bufferings.insideHead().isFear()

    when:
      bufferings.workOvertime();
    then:
      bufferings.insideHead().isSadness()

    when:
      bufferings.eatChocolate();
    then:
      bufferings.insideHead().isJoy()
  }

}

ステートパターンみたいにしてEnumにロジックを持つのは、あんまり好きじゃないけどね、これくらいは好き。

って書いたらうらがみさんが

って教えてくれたので、書いてみた。

public enum InsideHead {
  JOY,
  SADNESS,
  FEAR;

  public boolean isJoy() {
    return this == JOY;
  }

  public boolean isSadness() {
    return this == SADNESS;
  }

  public boolean isFear() {
    return this == FEAR;
  }

}

確かに、こっちのがすっきりして良いなぁ。ありがとう!

12/6 22:00 追記

うらがみさんが更に教えてくれたー(∩´∀`)∩ワーイ
sandbox/EnumReflectionSample.java at master · backpaper0/sandbox · GitHub

なるほどなぁ。逆に、基盤部分を作る人はこういうことにも気をつけないといけないんだなぁって思った。ありあとー!!

12/8 22:00 追記

さらにきつねさんが教えてくれた(∩´∀`)∩ワーイ

へぇーなるほどなぁ。

面白かった。書いてよかった。ありあとー!