じゃんけんプログラム

さて、じゃんけんプログラムで多態性を実現するならどんな感じだろうか?
とりあえず、グーとチョキとパーしかないんだから、enumを使ってみた。

public enum HandShape {
    ROCK("グー") {
        public void judge(HandShape enemy) {
            switch (enemy) {
            case ROCK:      draw(); break;
            case SCISSORS:  win();  break;
            case PAPER:     lose(); break;
            }
        }
    },
    SCISSORS("チョキ") {
        public void judge(HandShape enemy) {
            switch (enemy) {
            case ROCK:      lose(); break;
            case SCISSORS:  draw(); break;
            case PAPER:     win();  break;
            }
        }
    },
    PAPER("パー") {
        public void judge(HandShape enemy) {
            switch (enemy) {
            case ROCK:      win();  break;
            case SCISSORS:  lose(); break;
            case PAPER:     draw(); break;
            }
        }
    };
    private final String str;
    private HandShape(String str) { this.str = str; }
    
    public abstract void judge(HandShape enemy);
    
    private static void win() { System.out.println("あなたの勝ちです!"); }
    private static void lose() { System.out.println("あなたの負けです!"); }
    private static void draw() { System.out.println("あいこです!"); }
    
    public static HandShape valueOf(int i) { return values()[i]; }
}

judgeの中のswitchがいやな感じだけど、元のプログラムよりは遥かにマシだろう。
呼び出し元はこんな感じ。

HandShape own   = HandShape.valueOf(input);
HandShape enemy = HandShape.valueOf(think);
own.judge(enemy);

うん、スッキリ。