EnumのVisitorパターン

Enumに対してVisitorパターンを適用したいなーっていうケースはしばしばあったんですが、Visitor interface のメソッドオーバーロードのさせ方がわからずどうしたもんかな、と思ってました。

しかしよくよく考えればオーバーロードの解決って静的だからこれで十分だったんですね。

public enum AcceptableEnum {
    FOO {
        @Override
        public <R, E extends Throwable> R accept(final EnumVisitor<? extends R, E> visitor) throws E {
            return visitor.visitFoo();
        }
    },
    BAR {
        @Override
        public <R, E extends Throwable> R accept(final EnumVisitor<? extends R, E> visitor) throws E {
            return visitor.visitBar();
        }
    },
    HOGE {
        @Override
        public <R, E extends Throwable> R accept(final EnumVisitor<? extends R, E> visitor) throws E {
            return visitor.visitHoge();
        }
    };

    public abstract <R, E extends Throwable> R accept(EnumVisitor<? extends R, E> visitor) throws E;

    public static interface EnumVisitor<R, E extends Throwable> {
        R visitFoo() throws E;
        R visitBar() throws E;
        R visitHoge() throws E;
    }
}

難しく考えすぎてたようです。反省。