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 なのかなあ、と考えています。自分ひとりで書くなら、最初ので書くのも読むのもいいわけですが、複数人となるとそうはいかないよなあ…という。

Scala 使うのが早いですねほんとに…Java way は to hell なのではないか疑惑。