Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将包含多个AND或OR的If语句转换为switch语句?_Java_Boolean Expression - Fatal编程技术网

Java 如何将包含多个AND或OR的If语句转换为switch语句?

Java 如何将包含多个AND或OR的If语句转换为switch语句?,java,boolean-expression,Java,Boolean Expression,我有一段代码如下所示: String cStatus = getStatus_c(); String nStatus = getStatus_n(); if (!((cStatus.equals(PEN) && nStatus.equals(ACT)) || (cStatus.equals(PEN) && nStatus.equals(SUS)) || (cStatus.equals

我有一段代码如下所示:

     String cStatus = getStatus_c();
     String nStatus = getStatus_n(); 

     if (!((cStatus.equals(PEN) && nStatus.equals(ACT))
            || (cStatus.equals(PEN) && nStatus.equals(SUS))
            || (cStatus.equals(PEN) && nStatus.equals(PEN_CAN))
            || (cStatus.equals(ACT) && nStatus.equals(SUS))
            || (cStatus.equals(ACT) && nStatus.equals(PEN_CAN))
            || (cStatus.equals(SUS) && nStatus.equals(ACT))
            || (cStatus.equals(SUS) && nStatus.equals(PEN_CAN))
            || (cStatus.equals(PEN_CAN) && nStatus.equals(ACT))
            || (cStatus.equals(PEN_CAN) && nStatus.equals(CAN)))) 
{
  //Do someting//
} 
上面的代码满足了我的要求,但我想使用开关块等任何东西将其更改为更可读的代码。我知道开关是如何工作的,但我不确定如何转换现有代码


为了便于阅读,这里有一个清理过的版本(
a
PEN
B
ACT
C
SUS
D
PEN\u-CAN
):

以上代码满足了我的要求,但我想将其更改为 一些可读性更强的代码,比如开关块等

条件语句的混合不能用单个开关盒代替。
您可以使用嵌入式开关盒(外部用于处理
cStatus
,内部用于处理
nStatus
),但它实际上不会给出可读的代码:

boolean isEnabled = true;
switch (cStatus) {

  case PEN:
    switch (nStatus) {
     case ACT:
     case SUS:
     case PEN_CAN:
        isEnabled = false;
    }
    break;
  case ACT:
    switch (cStatus) {
      ...
    }
    break;
}
但是,您可以通过消除重复,并使用相同的
cStatus
值对条件语句进行分组,使代码更具可读性。
您还可以使用
List.contains()
方法检查与
cStatus
值关联的
nStatus

以下是一个片段:

List<String> nStatusValueForcStatutPen = Arrays.asList("ACT", "SUS", "PEN_CAN");
List<String> nStatusValueForcStatutAct = Arrays.asList("SUS", "PEN_CAN");
...
if (!((cStatus.equals(PEN) && nStatusValueForcStatutPen.contains(nStatus))
    || (cStatus.equals(ACT) && nStatusValueForcStatutAct.contains(nStatus))
   ...
}
List nStatusValueForcStatutPen=Arrays.asList(“ACT”、“SUS”、“PEN_CAN”);
List nStatusValueForcStatutAct=Arrays.asList(“SUS”、“PEN_CAN”);
...
如果(!((cStatus.equals(PEN)和&nStatusValueForcStatutPen.contains(nStatus))
||(cStatus.equals(ACT)和&nStatusValueForcStatutAct.contains(nStatus))
...
}

我建议您创建一个图表,以清楚地了解所有条件的组合

首先,您可以清楚地看到
PAN
始终是
当前状态
,因此,您可以缩短第一个条件

其次,有几个双向条件,其中某些状态可以是
新状态
当前状态
。很容易用第二个条件表示

最后,有两个由最后一个条件表示的直接单向条件(
SUS
->
PEN\u CAN
->
CAN

将它们结合在一起:

boolean penCondition = CURRENT_STATUS.equals(PEN) && 
    (NEW_STATUS.equals(SUS) || NEW_STATUS.equals(PEN_CAN) || NEW_STATUS.equals(ACT));
boolean twoWayCondition = CURRENT_STATUS.equals(ACT) && (NEW_STATUS.equals(SUS) && NEW_STATUS.equals(PEN_CAN)) || 
    NEW_STATUS.equals(ACT) && (CURRENT_STATUS.equals(SUS) && CURRENT_STATUS.equals(PEN_CAN));
boolean oneWayCondition = (CURRENT_STATUS.equals(SUS) && NEW_STATUS.equals(PEN_CAN)) || 
    (CURRENT_STATUS.equals(PEN_CAN) && NEW_STATUS.equals(CAN));

if !(penCondition || twoWayCondition || oneWayCondition) {

}
StatusChange curCange=新状态更改(当前状态,新状态);
如果(!ngChange.contains(curChange)){
……做点什么。。。。。
}
//新代码
类状态更改{
最终状态cur;
最终状态nw;
…覆盖等于方法。。。。。。
}
Set ngChange=new HashSet();
(
ngChange.add(新状态更改(笔、动作));
添加(新状态更改(ACT、PEN));
.........
)

您拥有的代码不需要switch语句。 您可以考虑使用<代码> SET/COD> < /P> 下面是一些代码:

public class Combination
{
    private final String cStatus;
    private final String nStatus;

    public Combination(
        final String cStatusValue,
        final String nStatusValue)
    {
        cStatus = StringUtils.trimToEmpty(cStatusValue);
        nStatus = StringUtils.trimToEmpty(nStatusValue);
    }

    public int hashCode()
    {
        final int returnValue;

        returnValue = cStatus.hashCode() + nStatus.hashCode();
    }

    public boolean equals(final Object object)
    {
        ... implement equals
    }
}   

... during setup
private Set<Combination> goodCombinationSet = new HashSet<Combination>();

... add all good combinations to the goodCombinationSet.


... when testing.

final Combination testCombination = new Combination(cStatus, nStatus);

if (goodCombinationSet.contains(testCombination))
... do something
公共类组合
{
私有最终字符串cStatus;
私有最终字符串nStatus;
公共合并(
最终字符串值,
最终字符串(值)
{
cStatus=StringUtils.trimToEmpty(cStatusValue);
nStatus=StringUtils.trimToEmpty(nStatusValue);
}
公共int hashCode()
{
最终返回值;
returnValue=cStatus.hashCode()+nStatus.hashCode();
}
公共布尔等于(最终对象)
{
…实现平等
}
}   
…在安装过程中
私有集goodCombinationSet=新HashSet();
…将所有好的组合添加到goodCombinationSet。
…测试时。
最终组合testCombination=新组合(cStatus,nStatus);
if(goodCombinationSet.contains(testCombination))
…做点什么

以下是我的最终代码,我认为它比以前的版本更可读、更清晰:

字符串cStatus=getcStatus();
字符串nStatus=getnStatus()

字符串转换字符串=cStatus+“”+nStatus


您不需要开关来清理它,您的if语句可以通过使用正确放置的括号来减少状态检查中的冗余来清理。您能否从逻辑上解释
布尔
表达式表示的内容?这样更容易理解…您可以创建子表达式并将其存储在
布尔
变量中变量,给它们好的变量名。然后您的
if
-表达式将使用这些变量并且可读。您还可以在表达式中识别常见变量并创建嵌套的
if
-表达式。
StatusChange curCange = new StatusChange(CURRENT_STATUS, NEW_STATUS);

if(!ngChange.contains(curChange)){

......do something.....

}

//New codes

class StatusChange{

  final Status cur;

  final Status nw;

  ..override equals method......

}


Set<StatusChange> ngChange=new HashSet();
(
ngChange.add(new StatusChange(PEN,ACT));
ngChange.add(new StatusChange(ACT,PEN));
.........
)
public class Combination
{
    private final String cStatus;
    private final String nStatus;

    public Combination(
        final String cStatusValue,
        final String nStatusValue)
    {
        cStatus = StringUtils.trimToEmpty(cStatusValue);
        nStatus = StringUtils.trimToEmpty(nStatusValue);
    }

    public int hashCode()
    {
        final int returnValue;

        returnValue = cStatus.hashCode() + nStatus.hashCode();
    }

    public boolean equals(final Object object)
    {
        ... implement equals
    }
}   

... during setup
private Set<Combination> goodCombinationSet = new HashSet<Combination>();

... add all good combinations to the goodCombinationSet.


... when testing.

final Combination testCombination = new Combination(cStatus, nStatus);

if (goodCombinationSet.contains(testCombination))
... do something
  switch (transitionString) {
     case "PEN_ACT":
        break;
     case "PEN_SUS":
        break;
     case "PEN_PENCAN":
        break;
     case "ACT_SUS":
        break;
     case "ACT_PENCAN":
        break;
     case "SUS_ACT":
        break;
     case "SUS_PENCAN":
        break;
     case "PENCAN_AC":
        break;
     case "PENCAN_CAN":
        break;
     default: {
        //DO SOMETHING 
        //In my case throwing an exception i.e. program will not continue further.
     }
  }
  {
  //DO SOMETHING ELSE
  }