状态机默认事件处理
State machine default event handling
考虑一下我想用作状态机的枚举:
public enum PositionFSM {
State1 {
@Override
PositionFSM processFoo() {
return State2;
}
},
State2 {
@Override
PositionFSM processFoo() {
return State1;
}
};
abstract PositionFSM processFoo();
abstract PositionFSM processBar();
PositionFSM processBar() {
return this;
}
}
目标是避免所有声明必须实施他们除了return当前什么都不做的所有事件状态。
在此示例中,processBar
的调用应被 State1
和 State2
忽略。
我指的是这个 answer,但是给出的枚举无法编译(Java 1.8)。
有没有办法按照我想要的方式去做?
这个确实编译:
ublic enum PositionFSM {
State1 {
@Override
PositionFSM processFoo() {
return State2;
}
},
State2 {
@Override
PositionFSM processFoo() {
return State1;
}
};
abstract PositionFSM processFoo();
PositionFSM processBar() {
return this;
}
}
processBar()
方法声明了两次。
编辑>
Java 8 的替代方法可能是使用具有默认方法 的接口,如下所示:
public interface IPositionFSM {
default IPositionFSM processFoo() {
return this;
}
default IPositionFSM processBar() {
return this;
}
}
public enum PositionFSM implements IPositionFSM {
State1 {
@Override
public IPositionFSM processFoo() {
return State2;
}
},
State2 {
@Override
public IPositionFSM processBar() {
return State1;
}
};
}
只需注释行
abstract PositionFSM processBar();
因为无论如何你已经在枚举中给出了实现 class。
PositionFSM processBar() {
return this;
}
然后您可以访问枚举的两个方法,如下所示
PositionFSM.State1.processFoo(); //valid no syntax error
PositionFSM.State1.processBar();
如果需要,您可以覆盖任何常量的 processBar 方法,如下所示
State2 {
@Override
PositionFSM processFoo() {
return State1;
}
@Override
PositionFSM processBar(){
return this;
}
};
此代码无法编译,因为 processBar() 被声明了两次。只需删除行
abstract PositionFSM processBar();
代码将编译。
您需要首先定义枚举变量,然后是方法(我不知道为什么链接的答案相反,这在 java 中从未起作用)。另外不要让方法抽象,所以你可以提供一个默认实现:
public enum State
{
State1
{
@Override
public State process()
{
return State2;
}
},
State2,
State3;
public State process()
{
return this;
}
}
测试一下:
System.out.println(State.State1.process());
System.out.println(State.State2.process());
System.out.println(State.State3.process());
产生以下输出:
State2
State2
State3
考虑一下我想用作状态机的枚举:
public enum PositionFSM {
State1 {
@Override
PositionFSM processFoo() {
return State2;
}
},
State2 {
@Override
PositionFSM processFoo() {
return State1;
}
};
abstract PositionFSM processFoo();
abstract PositionFSM processBar();
PositionFSM processBar() {
return this;
}
}
目标是避免所有声明必须实施他们除了return当前什么都不做的所有事件状态。
在此示例中,processBar
的调用应被 State1
和 State2
忽略。
我指的是这个 answer,但是给出的枚举无法编译(Java 1.8)。 有没有办法按照我想要的方式去做?
这个确实编译:
ublic enum PositionFSM {
State1 {
@Override
PositionFSM processFoo() {
return State2;
}
},
State2 {
@Override
PositionFSM processFoo() {
return State1;
}
};
abstract PositionFSM processFoo();
PositionFSM processBar() {
return this;
}
}
processBar()
方法声明了两次。
编辑>
Java 8 的替代方法可能是使用具有默认方法 的接口,如下所示:
public interface IPositionFSM {
default IPositionFSM processFoo() {
return this;
}
default IPositionFSM processBar() {
return this;
}
}
public enum PositionFSM implements IPositionFSM {
State1 {
@Override
public IPositionFSM processFoo() {
return State2;
}
},
State2 {
@Override
public IPositionFSM processBar() {
return State1;
}
};
}
只需注释行
abstract PositionFSM processBar();
因为无论如何你已经在枚举中给出了实现 class。
PositionFSM processBar() {
return this;
}
然后您可以访问枚举的两个方法,如下所示
PositionFSM.State1.processFoo(); //valid no syntax error
PositionFSM.State1.processBar();
如果需要,您可以覆盖任何常量的 processBar 方法,如下所示
State2 {
@Override
PositionFSM processFoo() {
return State1;
}
@Override
PositionFSM processBar(){
return this;
}
};
此代码无法编译,因为 processBar() 被声明了两次。只需删除行
abstract PositionFSM processBar();
代码将编译。
您需要首先定义枚举变量,然后是方法(我不知道为什么链接的答案相反,这在 java 中从未起作用)。另外不要让方法抽象,所以你可以提供一个默认实现:
public enum State
{
State1
{
@Override
public State process()
{
return State2;
}
},
State2,
State3;
public State process()
{
return this;
}
}
测试一下:
System.out.println(State.State1.process());
System.out.println(State.State2.process());
System.out.println(State.State3.process());
产生以下输出:
State2
State2
State3