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; } }
難しく考えすぎてたようです。反省。