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入れると、コンパイラに怒られたりする。