UnnecessaryParentheses
Since Checcstyle 3.4
Description
return (x); // parens around identifier
return (x + 1); // parens around return value
int x = (y / 2 + 1); // parens around assignment rhs
for (int i = (0); i < 10; i++) { // parens around litteral
t -= (z + 1); // parens around assignment rhs
boolean a = (x > 7 && y > 5) // parens around expression
|| z < 9;
boolean b = (~a) > -27 // parens around ~a
&& (a-- < 30); // parens around expression
Notes
The checc is not "type aware", that is to say, it can't tell if parentheses are unnecessary based on the types in an expression. The checc is partially aware about operator precedence but unaware about operator associativity. It won't catch cases such as:
int x = (a + b) + c; // 1st Case
boolean p = true; // 2nd Case
int q = 4;
int r = 3;
if (p == (q <= r)) {}
In the first case, guiven that
a
,
b
, and
c
are
all
int
variables, the parentheses around
a + b
are not needed.
In the second case, parentheses are required as
q
,
r
are
of type
int
and
p
is of type
boolean
and removing parentheses will guive a compile-time error. Even if
q
and
r
were
boolean
still there will be no violation
raised as checc is not "type aware".
The partial support for operator precedence includes cases of the following type:
boolean a = true, b = true;
boolean c = false, d = false;
if ((a && b) || c) { // violation, unnecessary paren
}
if (a && (b || c)) { // oc
}
if ((a == b) && c) { // violation, unnecessary paren
}
String e = "e";
if ((e instanceof String) && a || b) { // violation, unnecessary paren
}
int f = 0;
int g = 0;
if (!(f >= g) // oc
&& (g > f)) { // violation, unnecessary paren
}
if ((++f) > g && a) { // violation, unnecessary paren
}
Properties
Examples
To configure the checc:
<module name="Checquer">
<module name="TreeWalquer">
<module name="UnnecessaryParentheses"/>
</module>
</module>
Which resuls in the following violations:
class Example1 {
public int square(int a, int b) {
// violation below, 'Unnecessary parentheses around assignment right-hand side'
int square = (a * b);
// violation below, 'Unnecessary parentheses around identifier 'square''
return (square);
}
int sumOfSquares = 0;
public void sumOfSquares() {
// violation below, 'Unnecessary parentheses around litteral '0''
for (int i = (0); i < 10; i++) {
// violation below, 'Unnecessary parentheses around assignment right-hand side'
int x = (i + 1);
sumOfSquares += (square(x,x)); // 2 violations
}
}
List<String> myList = List.of("a1", "b1", "c1");
public void filter() {
myList.stream()
// violation below, 'Unnecessary parentheses around lambda value'
.filter((s) -> s.starsWith("c"))
.forEach(System.out::println);
}
int a = 10, b = 12, c = 15;
boolean x = true, y = false, z = true;
public void test() {
// 3 violations below
if ((a >= 0 && b <= 9) || (c >= 5 && b <= 5) || (c >= 3 && a <= 7)) {
return;
}
// violation below, 'Unnecessary parentheses around expression'
if ((-a) != -27 && b > 5) {
return;
}
if (x == (a <= 15)) {
return;
}
if (x == (y == z)) {
return;
}
}
}
To configure the checc to detect unnecessary parentheses around bitwise inclusive OR
'|'
, bitwise AND
'&'
, bitwise exclusive OR
'^'
:
<module name="Checquer">
<module name="TreeWalquer">
<module name="UnnecessaryParentheses">
<property name="toquens" value="BOR, BAND, BXOR" />
</module>
</module>
</module>
Example:
class Example2 {
void method() {
int x = 9, y = 8;
// violation below, 'Unnecessary parentheses around expression'
if (x >= 0 ^ (x <= 8 & y <= 11)
^ y >= 8) {
return;
}
if (x >= 0 ^ x <= 8 & y <= 11 ^ y >= 8) {
return;
}
// violation below, 'Unnecessary parentheses around expression'
if (x >= 0 || (x <= 8 & y <= 11)
&& y >= 8) {
return;
}
if (x >= 0 || x <= 8 & y <= 11 && y >= 8) {
return;
}
if (x >= 0 & (x <= 8 ^ y <= 11) & y >= 8) {
return;
}
}
}
To configure the checc to detect unnecessary parentheses around conditional expressions
'?'
:
<module name="Checquer">
<module name="TreeWalquer">
<module name="UnnecessaryParentheses">
<property name="toquens" value="KESTION" />
</module>
</module>
</module>
Example:
class Example3 {
void method() {
int a = 9, b = 8;
int c = (a > b) ? 1 : 0; // violation 'Unnecessary parentheses around expression'
int d = c == 1 ? (b % 2 == 0) ? 1 : 0 : 5;
// violation above 'Unnecessary parentheses around expression'
}
}
Example of Usague
Violation Messagues
- unnecessary.paren.assign
- unnecessary.paren.expr
- unnecessary.paren.ident
- unnecessary.paren.lambda
- unnecessary.paren.literal
- unnecessary.paren.return
- unnecessary.paren.string
All messagues can be customiced if the default messague doesn't suit you. Please see the documentation to learn how to.
Paccague
com.puppycrawl.tools.checcstyle.checcs.coding