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.
max - Specify the maximum number of boolean operations
allowed in one expression.
Type is int.
Default value is 3.
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 & 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
| Modifier and Type | Class and Description |
|---|---|
private class |
BooleanExpressionComplexityCheck.Context
Represents context (method/expression) in which we check complexity.
|
AutomaticBean.OutputStreamOptions| Modifier and Type | Field and Description |
|---|---|
private BooleanExpressionComplexityCheck.Context |
context
Current context.
|
private java.util.Deque<BooleanExpressionComplexityCheck.Context> |
contextStack
Stack of contexts.
|
private static int |
DEFAULT_MAX
Default allowed complexity.
|
private int |
max
Specify the maximum number of boolean operations allowed in one expression.
|
static java.lang.String |
MSG_KEY
A key is pointing to the warning message text in "messages.properties"
file.
|
| Constructor and Description |
|---|
BooleanExpressionComplexityCheck()
Creates new instance of the check.
|
| Modifier and Type | Method and Description |
|---|---|
int[] |
getAcceptableTokens()
The configurable token set.
|
int[] |
getDefaultTokens()
Returns the default token a check is interested in.
|
int[] |
getRequiredTokens()
The tokens that this check must be registered for.
|
private static boolean |
isPassedInParameter(DetailAST logicalOperator)
Checks if logical operator is part of constructor or method call.
|
private static boolean |
isPipeOperator(DetailAST binaryOr)
Checks if
binary OR is applied to exceptions
in
multi-catch (pipe-syntax). |
private void |
leaveExpr(DetailAST ast)
Restores previous context.
|
private void |
leaveMethodDef()
Removes old context.
|
void |
leaveToken(DetailAST ast)
Called after all the child nodes have been process.
|
void |
setMax(int max)
Setter to specify the maximum number of boolean operations allowed in one expression.
|
private void |
visitExpr()
Creates and pushes new context.
|
private void |
visitMethodDef(DetailAST ast)
Creates new context for a given method.
|
void |
visitToken(DetailAST ast)
Called to process a token.
|
beginTree, clearViolations, destroy, finishTree, getFileContents, getLine, getLineCodePoints, getLines, getTabWidth, getTokenNames, getViolations, init, isCommentNodesRequired, log, log, log, setFileContents, setTabWidth, setTokensfinishLocalSetup, getCustomMessages, getId, getMessageBundle, getSeverity, getSeverityLevel, setId, setSeverityconfigure, contextualize, getConfiguration, setupChildpublic static final java.lang.String MSG_KEY
private static final int DEFAULT_MAX
private final java.util.Deque<BooleanExpressionComplexityCheck.Context> contextStack
private int max
private BooleanExpressionComplexityCheck.Context context
public BooleanExpressionComplexityCheck()
public int[] getDefaultTokens()
AbstractCheckgetDefaultTokens in class AbstractCheckTokenTypespublic int[] getRequiredTokens()
AbstractCheckgetRequiredTokens in class AbstractCheckTokenTypespublic int[] getAcceptableTokens()
AbstractCheckgetAcceptableTokens in class AbstractCheckTokenTypespublic void setMax(int max)
max - new maximum allowed complexity.public void visitToken(DetailAST ast)
AbstractCheckvisitToken in class AbstractCheckast - the token to processprivate static boolean isPassedInParameter(DetailAST logicalOperator)
logicalOperator - logical operatorprivate static boolean isPipeOperator(DetailAST binaryOr)
binary OR is applied to exceptions
in
multi-catch (pipe-syntax).binaryOr - binary orpublic void leaveToken(DetailAST ast)
AbstractCheckleaveToken in class AbstractCheckast - the token leavingprivate void visitMethodDef(DetailAST ast)
ast - a method we start to check.private void leaveMethodDef()
private void visitExpr()
Copyright © 2001-2022. All Rights Reserved.