2017-10-04 42 views
0

我atempting实现(使用Java),一个有限状态机,我只能坚持了以下问题如何实现与Java枚举“环状” FSM

我的要求是,我有一个需要系统循环通过一组已知状态

例如S1 -> S2 -> S3 ... SN -> S1

然后停止,一旦它已经回到它的初始状态。

问题是初始状态可以是任何已知的状态,例如S1到SN(和我的控制)

无论状态开始我需要确保所有其他国家正在返回 到任何初始状态是

我想之前在正确的顺序“参观”的怪圈采用一个枚举如下: -

https://www.mirkosertic.de/blog/2013/04/implementing-state-machines-with-java-enums/

public enum State { 

    INITIAL { 
     @Override 
     State doSomething(final String aParameter) { 
      System.out.println("Doing Something in INITIAL state and jumping to NEXT_STEP, argument = " + aParameter); 
      return NEXT_STEP; 
     } 
    }, 
    NEXT_STEP { 
     @Override 
     State doSomething(final String aParameter) { 
      System.out.println("Doing Something in NEXT_STEP and jumping into FINAL, argument = " + aParameter); 
      return FINAL; 
     } 
    }, 
    FINAL { 
     @Override 
     State doSomething(final String aParameter) { 
      System.out.println("I am in FINAL state, argument = " + aParameter); 
      return this; 
     } 
    }; 

    abstract State doSomething(String aParameter); 

} 

我怎样才能实现循环FSM?

回答

1
  • 每创建一个状态枚举值。
  • 返回doSomething下一个状态。
  • 开始与一些国家和周期,doSomething,直到你再次达到它。

实际上,这将是这样的:

public enum State { 

    S1 { 
     @Override 
     State doSomething() { 
      // Do something useful 
      return S2; 
     } 
    }, 
    S2 { 
     @Override 
     State doSomething() { 
      // Do something useful 
      return S3; 
     } 
    }, 
    // ... 
    SN { 
     @Override 
     State doSomething() { 
      // Do something useful 
      return S1; 
     } 
    }, 
    abstract State doSomething(); 
} 

然后:

State state = initialState; 
do { 
    // Do something useful with state 
} 
while((state = initialState.doSomething()) != initialState); 

说实话,我也不会用枚举实现FSM你上述计划的忠实粉丝因为它使得FSM在枚举中非常硬编码。

+0

感谢这一点,我想你的意思是S2返回S3虽然 – Hector

+0

@Hector权,纠正。 – lexicore

0
public class Main { 
    public static enum State { 
     S1 { 
      State doSomething(final String arg) { 
       System.out.println("In state: " + name()); 
       return S2; 
      } 
     }, 
     S2 { 
      @Override 
      State doSomething(final String arg) { 
       System.out.println("In state: " + name()); 
       return S3; 
      } 
     }, 
     S3 { 
      @Override 
      State doSomething(final String arg) { 
       System.out.println("In state: " + name()); 
       return S1; 
      } 
     }; 

     abstract State doSomething(final String arg); 
    } 

    public static void main(final String[] args) { 
     State state = State.S2; 
     int count = State.values().length + 1; 
     while (count-- > 0) 
      state = state.doSomething("arg"); 
    } 
} 

打印:

在状态:S2

在状态:S3

在状态:S1

在状态:S2