DFAをfluent interfaceで書いてみる
某所で変態扱いされたので解説がてら。
こんな "1 plus 2 minus 5 is" みたいなことを書けるDFAをJavaで書いてみる。
単純に現状態を表すのクラスの中に「次状態 入力() {...}」なメソッドを作ってるだけ。
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); } } }