こんな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) December 6, 2015
って教えてくれたので、書いてみた。
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 追記
さらにきつねさんが教えてくれた(∩´∀`)∩ワーイ
@backpaper0 @bufferings それか単純にinstanceof Enumを使うのが良いかと.Hogeがインターフェースで,その値がenumかどうかを調べたかったらinstanceofのほうがなおさら確実です https://t.co/p15DsdLYVN
— 卒研で死にそうなきつね (@bitter_fox) 2015, 12月 7
へぇーなるほどなぁ。
面白かった。書いてよかった。ありあとー!