我有以下的Java方法:PMD UselessParentheses违反
private int calculate() {
return (bytes[0] & 0xff) + ((bytes[1] & 0xff) << 8);
}
PMD对这个代码抱怨与 “UselessParentheses” 违规。
我评论了operator precentence rules,但我仍然没有在该代码中看到多余的括号。我错过了什么吗?
我有以下的Java方法:PMD UselessParentheses违反
private int calculate() {
return (bytes[0] & 0xff) + ((bytes[1] & 0xff) << 8);
}
PMD对这个代码抱怨与 “UselessParentheses” 违规。
我评论了operator precentence rules,但我仍然没有在该代码中看到多余的括号。我错过了什么吗?
有这个代码没有不必要的括号,你可以看到,如果你运行:
byte [] bytes = new byte[] {1,2};
System.out.println((bytes[0] & 0xff) + ((bytes[1] & 0xff) << 8));
System.out.println(bytes[0] & 0xff + ((bytes[1] & 0xff) << 8));
System.out.println((bytes[0] & 0xff) + (bytes[1] & 0xff) << 8);
System.out.println((bytes[0] & 0xff) + (bytes[1] & 0xff << 8));
而且,有时它实际上是很好的添加额外的括号可读性。例如:
int i = x << y + z; // this will shift x by y+z bits
int j = x << (y + z); // equivalent, but more readable
仅供参考:已通过PMD 5.3.5修正([bug#1407](https://sourceforge.net/p/pmd/bugs/1407))。所以 - 更新PMD应该摆脱这种错误的违规行为。 – adangel
仔细阅读操作偏好,代码行和PMD的警告后,这可能是一个罕见的情况下,优先级是指像
PMD complains on this code with a useless (parenthesis warning)
而不是
PMD complains on this code with a (useless parenthesis) warning.
施加一个
你的代码是正确的,括号不是多余的。删除它们会使代码不易读,并且每个代码都是需要的。事实上,这整个问题是值得的xkcd comic
在该块中删除括号:(字节[0]&0xff的) – eg04lt3r
重要的是,即使有一个多余的对括号(我看不到任何),代码将远远小于没有它可读。这是写的方式确切地表达了你的逻辑意味着要做的事情。 – biziclop
对不起,我的错误是删除(bytes [0]&0xff)中的括号。或者,您可以将PMD的压制警告添加到此方法。 – eg04lt3r