yojikのlog

yojikのブログです

Java as DSL

この記事を読んでピンときたので、内部DSLとしてのJavaの可能性を探ってみる。
たとえば、JSONフォーマットをじっくりみたあと、暴れはっちゃくのように瞑想すると、こんな感じのクラス構造が、、

class JSON {
  List<Member> members;
  JSON(Member... t) {
    members=Arrays.asList(t);
  }
}
class JSONArray {
  List<Object> elements;
  JSONArray(Object... obj) {
    this.elements = Arrays.asList(obj);
  }
}
class Member {
  String name;
  Object value;
  public Member(String name, Object value) {
    this.name = name;
    this.value = value;
  } 
} 

あとは、こんな感じで使える。

public class Main {
  public static void main(String[] value) {
  JSON person =  new JSON(
    new Member(
      "name", new JSONArray("foo","bar")),
    new Member(
      "age", 30));
  }
}

可変長引数とautoboxingのおかげで大分楽になって、内部DSLっぽく書けるようになったと思う。ちょっと便利なのは、ある程度チェック機構(みたいなの)が働くこと。
JSONオブジェクトの中に、いきなりJSONArray入れると、コンパイラに怒られたりする。