问题描述
我正在编写一个简单的状态机作为练习。 当我有很多带有条件的状态时,我认为它变得太不可读了。 我想一眨眼就看到我回到了什么状态。
例如现在的情况:
if ((currentState.equals(State.s70_SupplyFanStart)) && (/**Some statement*/)); Or
((currentState.equals(State.s80_ControlStart)) && (/**Some statement*/)); Or
((currentState.equals(State.s90_LimitMonitoringStart)) && (/**Some statement*/)); Or
((currentState.equals(State.s99_Fault)) && (/**Some statement*/)); Or
((currentState.equals(State.s100_Interlocked)) && (/**Some statement*/));{
return State.s00_StandBy;
}
以上代码无法正确折叠,只能返回文件夹。所以,你会继续看到这一切:
if (((currentState.equals(State.s70_SupplyFanStart)) && (/**Some statement*/)); Or
((currentState.equals(State.s80_ControlStart)) && (/**Some statement*/)); Or
((currentState.equals(State.s90_LimitMonitoringStart)) && (/**Some statement*/)); Or
((currentState.equals(State.s99_Fault)) && (/**Some statement*/)); Or
((currentState.equals(State.s100_Interlocked)) && (/**Some statement*/)); {...}
例如,我希望看到的是这样的:
return State.s00_StandBy IF {
/**statement_1 = true or */
/**statement_2 = true or
/**statement_3 = true;*
}
所以如果你把它折叠起来,你只会看到这样的东西:
return State.StandBy IF {...}
最后,当它们这样排列时找到某些状态会好得多:
return State.StandBy IF {...}
return State.s70_SupplyFanStart IF {...}
return State.s80_ControlStart IF {...}
return State.s90_LimitMonitoringStart IF {...}
等等。
解决方法
您可以将状态建模为枚举,并将转换逻辑封装在枚举中。
所以你改为调用:
return currentState.nextState();
您的枚举类似于:
public enum State {
s70_SupplyFanStart {
@Override
public State nextState() {
// if...
return ...;
}
},s80_ControlStart {
@Override
public State nextState() {
// if ...
return ....;
}
},....
public abstract State nextState();
}
参见示例:https://www.baeldung.com/java-enum-simple-state-machine
,为此目的使用 switch
语句不是更方便吗?
假设 currentState
是 State
枚举的实例,代码可以重写:
boolean otherCondition = false;
switch (currentState) {
s70_SupplyFanStart:
otherCondition = /*statement 1*/;
break;
s80_ControlStart:
otherCondition = /*statement 2*/;
break;
s90_LimitMonitoringStart:
otherCondition = /*statement 3*/;
break;
s99_Fault:
otherCondition = /*statement 4*/;
break;
s100_Interlocked:
otherCondition = /*statement 5*/;
break;
}
if (otherCondition) {
return State.s00_StandBy;
}
// ...
或者使用来自 Java 12+ 的较短的 switch
语法:
boolean otherCondition = switch (currentState) {
s70_SupplyFanStart -> /*statement 1*/;
s80_ControlStart -> /* statement 2*/;
s90_LimitMonitoringStart -> /*statement 3*/;
s99_Fault -> /*statement 4*/;
s100_Interlocked -> /*statement 5*/;
default -> false;
}
if (otherCondition) {
return State.s00_StandBy;
}