sum type in Java
ってどうするのが Java らしいのかなあみたいな。
public class Base { public static class A { ... } public static class B { ... } private A a; private B b; private Base(A a, B b) { this.a = a; this.b = b; } public static Base createA(...) { return new Base(new A(...), null); } public static Base createB(...) { return new Base(null, new B(...)); }
ここで普通にゲッターとか書くと、
public Base.A getA() { return a; } public Base.B getB() { return b; }
なんか (a != null && b == null) || (a == null && b != null) って見えにくいなあっていう…
それで仕方なく、
public interface Folder<T> { T a(A a); T b(B b); } public <T> fold(Folder<T> folder) { return a != null ? folder.a(a) : folder.b(b); } }
とかしてみるわけですけど、
Base base = Base.createA(...); Integer n = base.fold(new Base.Folder<Integer> { public Integer a(Base.A a) { return 1; } public Integer b(Base.B b) { return 2; } });
ウーンダサイ…
どうするのが Java way なのかなあ、と考えています。自分ひとりで書くなら、最初ので書くのも読むのもいいわけですが、複数人となるとそうはいかないよなあ…という。