How to convert an If statement consisting of several AND, OR to a switch statement?

I have a piece of code that looks something like this:

     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//
} 

The code above fulfills my requirements, but I want to change it to some more readable code, using something like a block of switches, etc. I know how the switch works, but I'm not sure how to hide the existing code.


Just for readability, here is a cleaned version ( Ais PEN, Bis ACT, Cis SUSand Dis PEN_CAN):

if (! (    (cStat == A && nStat == B)
        || (cStat == A && nStat == C)
        || (cStat == A && nStat == D)
        || (cStat == B && nStat == C)
        || (cStat == B && nStat == D)
        || (cStat == C && nStat == B)
        || (cStat == C && nStat == D)
        || (cStat == D && nStat == B)
        || (cStat == D && nStat == D)
      )
)
+4
source share
5 answers

The above code fulfills my requirements, but I want to change it to some more readable code, using something like a switch block, etc.

AND OR single.
( 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() nStatus, cStatus.

:

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))
   ...
}
+3

, .

-, , PAN CURRENT_STATUS, .

-, , NEW_STATUS, CURRENT_STATUS. .

, (SUSPEN_CANCAN), .

:

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) {

}
+1

, , switch. Set

:

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
+1

, , , :

cStatus = getcStatus();
  nStatus = getnStatus();

String transitionString = cStatus + "_" + nStatus;

  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
  }
+1
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));
.........
)
0

Source: https://habr.com/ru/post/1687077/


All Articles