DFAをfluent interfaceで書いてみる

某所で変態扱いされたので解説がてら。

こんな "1 plus 2 minus 5 is" みたいなことを書けるDFAJavaで書いてみる。

単純に現状態を表すのクラスの中に「次状態 入力() {...}」なメソッドを作ってるだけ。

public class Dfa {
    public static void main(String[] args) {
        System.out.println(
            new S0().$(1).plus().$(2).minus().$(5).is());
    }
    static class S0 {
        S1 $(int v) { return new S1(v); };
    }
    static class S1 {
        int val;
        S1(int v) { this.val = v; }
        S2 plus() { return new S2(val); }
        S3 minus() { return new S3(val); }
        S4 is() { return new S4(val); }
    }
    static class S2 {
        int val;
        S2(int v) { this.val = v; }
        S1 $(int v) { return new S1(val + v); }
    }
    static class S3 {
        int val;
        S3(int v) { this.val = v; }
        S1 $(int v) { return new S1(val - v); }
    }
    static class S4 {
        int val;
        S4(int v) { this.val = v; }
        @Override public String toString() {
            return String.valueOf(val);
        }
    }
}