Class BooleanExpressionComplexityCheck

  • All Implemented Interfaces:
    Configurable, Contextualizable

    public final class BooleanExpressionComplexityCheck
    extends AbstractCheck

    Restricts the number of boolean operators (&&, ||, &, | and ^) in an expression.

    Rationale: Too many conditions leads to code that is difficult to read and hence debug and maintain.

    Note that the operators & and | are not only integer bitwise operators, they are also the non-shortcut versions of the boolean operators && and ||.

    Note that &, | and ^ are not checked if they are part of constructor or method call because they can be applied to non-boolean variables and Checkstyle does not know types of methods from different classes.

    • Property max - Specify the maximum number of boolean operations allowed in one expression. Type is int. Default value is 3.
    • Property tokens - tokens to check Type is java.lang.String[]. Validation type is tokenSet. Default value is: LAND, BAND, LOR, BOR, BXOR.

    To configure the check:

     <module name="BooleanExpressionComplexity"/>
     

    Code Example:

     public class Test
     {
     public static void main(String ... args)
     {
     boolean a = true;
     boolean b = false;
    
     boolean c = (a & b) | (b ^ a);       // OK, 1(&) + 1(|) + 1(^) = 3 (max allowed 3)
    
     boolean d = (a & b) ^ (a || b) | a;  // violation, 1(&) + 1(^) + 1(||) + 1(|) = 4
     }
     }
     

    To configure the check with 5 allowed operation in boolean expression:

     <module name="BooleanExpressionComplexity">
       <property name="max" value="5"/>
     </module>
     

    Code Example:

     public class Test
     {
      public static void main(String ... args)
      {
       boolean a = true;
       boolean b = false;
    
       boolean c = (a & b) | (b ^ a) | (a ^ b);   // OK, 1(&) + 1(|) + 1(^) + 1(|) + 1(^) = 5
    
       boolean d = (a | b) ^ (a | b) ^ (a || b) & b; // violation,
                                                   // 1(|) + 1(^) + 1(|) + 1(^) + 1(||) + 1(&) = 6
      }
     }
     

    To configure the check to ignore &amp; and |:

     <module name="BooleanExpressionComplexity">
       <property name="tokens" value="BXOR,LAND,LOR"/>
     </module>
     

    Code Example:

     public class Test
     {
      public static void main(String ... args)
       {
         boolean a = true;
         boolean b = false;
    
         boolean c = (!a && b) | (a || !b) ^ a;    // OK, 1(&&) + 1(||) + 1(^) = 3
                                                    // | is ignored here
    
         boolean d = a ^ (a || b) ^ (b || a) & a; // violation, 1(^) + 1(||) + 1(^) + 1(||) = 4
                                                   // & is ignored here
        }
      }
     

    Parent is com.puppycrawl.tools.checkstyle.TreeWalker

    Violation Message Keys:

    • booleanExpressionComplexity
    Since:
    3.4