こんな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にロジックを持つのは、あんまり好きじゃないけどね、これくらいは好き。
って書いたらうらがみさんが
@bufferings 同意ー!で、私はisJoyの中身をreturn this == JOY;ってするのが好き
— うらがみ (@backpaper0) 2015, 12月 6って教えてくれたので、書いてみた。
public enum InsideHead { JOY, SADNESS, FEAR; public boolean isJoy() { return this == JOY; } public boolean isSadness() { return this == SADNESS; } public boolean isFear() { return this == FEAR; } }
確かに、こっちのがすっきりして良いなぁ。ありがとう!