状态机默认事件处理

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 的调用应被 State1State2 忽略。

我指的是这个 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