Search code examples
javaboolean-expression

How do I convert If statement consisting multiple AND, OR into a switch statement?


I have a piece of code which 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//
} 

Above code is fulfilling my requirements but I want to change it to some more readable code using anything like switch block etc. I know how switch works but I'm not sure how to covert my existing code.


Just for readability, here is a cleaned-up version (A is PEN, B is ACT, C is SUS and D is 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)
      )
)

Solution

  • Above code is fulfilling my requirements but I want to change it to some more readable code using anything like switch block etc.

    A mixing of AND and OR conditional statement cannot be replaced by a single switch case.
    You could use embedded switch cases (an outer to handle cStatus and an inner to handle nStatus) but it will really not give a readable code :

    boolean isEnabled = true;
    switch (cStatus) {
    
      case PEN:
        switch (nStatus) {
         case ACT:
         case SUS:
         case PEN_CAN:
            isEnabled = false;
        }
        break;
      case ACT:
        switch (cStatus) {
          ...
        }
        break;
    }
    

    But you could make your code more readable by eliminating the duplication and by grouping conditional statements with the same cStatus value for example.
    You could also use the List.contains() method to check the nStatus value associated to the cStatus value.

    Here is a snippet :

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