如何验证Java对象从一种状态到另一种状态的转换(两种状态都由用户定义)?

时间:2019-07-15 04:31:38

标签: java

我有一个Java对象,可以转换为用户定义的不同状态。但是这些过渡应该按顺序进行。我可以通过哪些方式来验证状态更改?

状态:

唤醒, 做好准备, 工作, 吃, 睡觉

对象可以具有以下状态,但应遵循顺序。该对象可以从唤醒进入准备状态,但无法正常工作。

我尝试使用HashMaps和Arrays,但不确定哪种方法是使用Java编程进行验证的有效且正确的方法

我考虑过像下面那样使用Hashmaps。

HashMap<String, String> stateMap = new HashMap<>();
stateMap.put("Wakeup", "get REady");
stateMap.put("get Ready", "Work"); 

并确认更改。

但这还有一个挑战,在我的实际问题中,对象可以从一种状态变为一种以上的状态,并且所有状态都是有效的。因此,我在这里停留在思考哪种方法是用Java做到这一点的正确方法?

1 个答案:

答案 0 :(得分:0)

您可以创建一个这样的枚举:

public enum State {
    WAKE_UP(Set.of(1)),
    GET_READY(Set.of(2)),
    WORK(Set.of(3, 4)), //multiple valid next states
    EAT(Set.of(4)),
    SLEEP(Set.of(0));

    private Set<Integer> validNextStates;

    State(Set<Integer> validNextStates) {
        this.validNextStates = validNextStates;
    }

    public Set<State> getValidNextStates() {
        return Arrays.stream(values())
                .filter(state -> validNextStates.contains(state.ordinal()))
                .collect(Collectors.toSet());
    }

    public boolean isValidNextState(State nextState) {
        return getValidNextStates().contains(nextState);
    }
}

然后像这样进行验证:

System.out.println(State.GET_READY.isValidNextState(State.WORK));
System.out.println(State.GET_READY.isValidNextState(State.EAT));

输出

true
false