Since Checkstyle 3.0
Attention: The break in case blocks is not counted to allow compact view.
name | description | type | default value | since |
---|---|---|---|---|
allowEmptyLoopBody | Allow loops with empty bodies. | boolean | false |
6.12.1 |
allowSingleLineStatement | Allow single-line statements without braces. | boolean | false |
6.5 |
tokens | tokens to check | subset of tokens LITERAL_DO , LITERAL_ELSE , LITERAL_FOR , LITERAL_IF , LITERAL_WHILE , LITERAL_CASE , LITERAL_DEFAULT , LAMBDA . | LITERAL_DO , LITERAL_ELSE , LITERAL_FOR , LITERAL_IF , LITERAL_WHILE . | 3.0 |
To configure the check:
<module name="Checker"> <module name="TreeWalker"> <module name="NeedBraces"/> </module> </module>
Example:
class Example1 { String obj = new String(); String value = new String(); int counter = 1; int count = 0; int num = 12; String o = "O"; public boolean Example1() { if (obj.equals(num)) return true; // violation above, ''if' construct must use '{}'s.' if (true) { count = 2; } else // violation above, ''else' construct must use '{}'s.' return false; for (int i = 0; i < 5; i++) { ++count;} do // violation, ''do' construct must use '{}'s.' ++count; while (false); for (int j = 0; j < 10; j++); // violation above, ''for' construct must use '{}'s.' for(int i = 0; i < 10; value.charAt(12)); // violation above, ''for' construct must use '{}'s.' while (counter < 10) // violation above, ''while' construct must use '{}'s.' ++count; while (value.charAt(12) < 5); // violation above, ''while' construct must use '{}'s.' switch (num) { case 1: counter++; break; // ok above, because break in case blocks is not counted to allow compact view } return true; } }
To configure the check for if
and
else
blocks:
<module name="Checker"> <module name="TreeWalker"> <module name="NeedBraces"> <property name="tokens" value="LITERAL_IF, LITERAL_ELSE"/> </module> </module> </module>
Example:
class Example2 { String obj = new String(); String value = new String(); int counter = 1; int count = 0; int num = 12; String o = "O"; public boolean Example2() { if (obj.equals(num)) return true; // violation above, ''if' construct must use '{}'s.' if (true) { count = 2; } else // violation above, ''else' construct must use '{}'s.' return false; for (int i = 0; i < 5; i++) { ++count;} do // ok, because DO is not a target of validation ++count; while (false); for (int j = 0; j < 10; j++); // ok above, because FOR is not a target of validation for(int i = 0; i < 10; value.charAt(12)); // ok above, because FOR is not a target of validation while (counter < 10) // ok above, because WHILE is not a target of validation ++count; while (value.charAt(12) < 5); // ok above, because WHILE is not a target of validation switch (num) { case 1: counter++; break; // ok above, because break in case blocks is not counted to allow compact view } return true; } }
To configure the check to allow single-line statements
(if, while, do-while, for
) without braces:
<module name="Checker"> <module name="TreeWalker"> <module name="NeedBraces"> <property name="allowSingleLineStatement" value="true"/> <property name="tokens" value="LITERAL_IF, LITERAL_WHILE, LITERAL_DO, LITERAL_FOR"/> </module> </module> </module>
Example:
class Example3 { String obj = new String(); String value = new String(); int counter = 1; int count = 0; int num = 12; String o = "O"; public boolean Example3() { if (obj.equals(num)) return true; // ok above, because single line IF statement is allowed in config. if (true) { count = 2; } else // ok above, because single line ELSE statement is allowed in config. return false; for (int i = 0; i < 5; i++) { ++count;} do // violation, ''do' construct must use '{}'s.' ++count; while (false); for (int j = 0; j < 10; j++); // ok above, because single line FOR statement is allowed in config. for(int i = 0; i < 10; value.charAt(12)); // ok above, because single line FOR statement is allowed in config. while (counter < 10) // violation above, ''while' construct must use '{}'s.' ++count; while (value.charAt(12) < 5); // ok above, because single line FOR statement is allowed in config. switch (num) { case 1: counter++; break; // ok above, because break in case blocks is not counted to allow compact view } return true; } }
To configure the check to allow case, default
single-line statements
without braces:
<module name="Checker"> <module name="TreeWalker"> <module name="NeedBraces"> <property name="tokens" value="LITERAL_CASE, LITERAL_DEFAULT"/> <property name="allowSingleLineStatement" value="true"/> </module> </module> </module>
Next statements won't be violated by check:
class Example4 { String obj = new String(); String value = new String(); int counter = 1; int count = 0; int num = 12; String o = "O"; public boolean Example4() { if (obj.equals(num)) return true; // ok above, because IF is not a target of validation if (true) { count = 2; } else // ok above, because ELSE is not a target of validation return false; for (int i = 0; i < 5; i++) { ++count;} do // ok, because DO is not a target of validation ++count; while (false); for (int j = 0; j < 10; j++); // ok above, because FOR is not a target of validation for(int i = 0; i < 10; value.charAt(12)); // ok above, because FOR is not a target of validation while (counter < 10) // ok above, because WHILE is not a target of validation ++count; while (value.charAt(12) < 5); // ok above, because WHILE is not a target of validation switch (num) { case 1: counter++; break; // ok above, because break in case blocks is not counted to allow compact view } return true; } }
To configure the check to allow loops (while, for
) with empty bodies:
<module name="Checker"> <module name="TreeWalker"> <module name="NeedBraces"> <property name="allowEmptyLoopBody" value="true"/> <property name="tokens" value="LITERAL_WHILE, LITERAL_FOR"/> </module> </module> </module>
Example:
class Example5 { String obj = new String(); String value = new String(); int counter = 1; int count = 0; int num = 12; String o = "O"; public boolean Example5() { if (obj.equals(num)) return true; // ok above, because IF is not a target of validation if (true) { count = 2; } else // ok above, because ELSE is not a target of validation return false; for (int i = 0; i < 5; i++) { ++count;} do // ok, because DO is not a target of validation ++count; while (false); for (int j = 0; j < 10; j++); // ok above, because FOR is not a target of validation for(int i = 0; i < 10; value.charAt(12)); // ok above, because FOR is not a target of validation while (counter < 10) // violation above, ''while' construct must use '{}'s.' ++count; while (value.charAt(12) < 5); // ok above, because WHILE is not a target of validation switch (num) { case 1: counter++; break; // ok above, because break in case blocks is not counted to allow compact view } return true; } }
To configure the check to lambdas:
<module name="Checker"> <module name="TreeWalker"> <module name="NeedBraces"> <property name="tokens" value="LAMBDA"/> <property name="allowSingleLineStatement" value="true"/> </module> </module> </module>
Results in following:
class Example6 { enum HttpMethod {GET, OPTIONS} Object result = new Object(); private CustomCompletableFuture<Object> allowedFuture; Example6() { allowedFuture = new CustomCompletableFuture<>(); allowedFuture.addCallback(result -> assertEquals("Invalid response", // violation EnumSet.of(HttpMethod.GET, HttpMethod.OPTIONS), result), ex -> fail(ex.getMessage())); allowedFuture.addCustomCallback(() -> { return assertEquals("Invalid response", EnumSet.of(HttpMethod.GET, HttpMethod.OPTIONS), result);}, ex -> fail(ex.getMessage()));} private Object assertEquals(String invalidResponse, EnumSet<HttpMethod> get, Object result) { return result;} private String fail(String message) { return message; }} class CustomCompletableFuture<T> { private CompletableFuture<T> allowedFuture; public CustomCompletableFuture() { allowedFuture = new CompletableFuture<>(); } public void addCallback(java.util.function.Consumer<T> successCallback, java.util.function.Consumer<Throwable> failureCallback) {} public void addCustomCallback(java.util.function.Supplier<Object> successLambda, java.util.function.Consumer<Throwable> failureLambda) {} }
All messages can be customized if the default message doesn't suit you. Please see the documentation to learn how to.
com.puppycrawl.tools.checkstyle.checks.blocks