在java中使用/练习括号的最佳方法

时间:2016-04-04 07:46:20

标签: java sonarqube parentheses

在使用Sonar静态代码分析器时,我发现Sonar在使用括号时有些令人困惑(可能只对我说)。

下面是Sonar说删除无用括号的几个代码片段:

line>1  String auth = "Basic "+ com.somepackge.someMethod(((String) (parent.proxyUsername+ ":" + parent.proxyPassword)));
line>2  return rawtime.length() > 3 ? (rawtime.substring(0, rawtime.length() - 2) + rawtime.substring(rawtime.length() - 2, rawtime.length()).toLowerCase()) : rawtime;

虽然我已经用下面的一行取代上面的线以保持声纳平静:):

Line>3 String auth = "Basic "+ com.somepackge.someMethod((String) (parent.proxyUsername+ ":" + parent.proxyPassword));

Line>4 return  rawtime.length() > 3 ? rawtime.substring(0, rawtime.length() - 2) + rawtime.substring(rawtime.length() - 2, rawtime.length()).toLowerCase() : rawtime;

所以讨论这个问题的原因是:

  1. 实际上使用大括号/括号是减少混淆的方法,所以为什么要删除这些括号。

  2. 在java中编写任何复杂语句时使用括号的最佳方法是什么。

  3. 在这里看到行> 1和行> 4我认为

    (String) (parent.proxyUsername+ ":" + parent.proxyPassword)

    这部分代码应该有大括号以避免混淆,但Sonar期望的是:

       (String) parent.proxyUsername+ ":" + parent.proxyPassword
    

    任何建议都会有很大的帮助。我得到了一些关于这个问题的链接,但那些没有多大帮助。

4 个答案:

答案 0 :(得分:0)

Line 1有多余的括号,但Line 2的括号增加了三元语句的清晰度。

2中的额外括号是否有用是有争议的 - 但没有理由不删除1中的多余括号。

通常最好使用额外的括号来表达您对代码应该做什么的意图,或者按照事情发生的顺序消除歧义。

答案 1 :(得分:0)

这两个版本之间存在语义差异:

(String) (parent.proxyUsername+ ":" + parent.proxyPassword)

(String) parent.proxyUsername+ ":" + parent.proxyPassword

在第一组中,第二组()已经评估为String,隐式调用parent.proxyUsername.toString()proxyUsername转换为String。所以演员是多余的,应该删除恕我直言。第二个版本将parent.proxyUsername强制转换为String,并且会抛出一个异常,因为它没有运行时类型String(仅当它被声明为String时才会被转换为多余的)。

我同意第2行和第4行无论是否有多余的括号都很复杂。如果你想要清晰,请重写。也就是说,多余的括号有时候很清楚恕我直言,我偶尔会使用它们。

答案 2 :(得分:0)

第一个片段

String auth = "Basic "+ someMethod(((String) (parent.proxyUsername+ ":" + parent.proxyPassword)));

您可以将其重写为:

String auth = "Basic "+ someMethod(parent.proxyUsername+ ":" + parent.proxyPassword);

因为字符串连接运算符已经进行了字符串转换。除非您希望在ClassCastExceptionproxyUsername不是字符串时抛出proxyPassword

第二个片段

return rawtime.length() > 3 ? (rawtime.substring(0, rawtime.length() - 2) + rawtime.substring(rawtime.length() - 2, rawtime.length()).toLowerCase()) : rawtime;

括号确实是不必要的,但声明是完全不可读的。如果你想继续使用三元运算符,我建议将这些语句分成几行:

return rawtime.length() > 3
       ? rawtime.substring(0, rawtime.length() - 2) + rawtime.substring(rawtime.length() - 2, rawtime.length()).toLowerCase()
       : rawtime;

或者你可以恢复这个条件:

return rawtime.length() <= 3 ? rawtime :
       rawtime.substring(0, rawtime.length() - 2) + rawtime.substring(rawtime.length() - 2, rawtime.length()).toLowerCase();

答案 3 :(得分:-2)

最好的方法是将你要投射的类放在括号中,然后将整个部分转换为另一个括号,然后将这整个代码包含在容器括号中,你的代码应如下所示((字符串)(X + Y))。

我希望这很有帮助,谢谢。