繁体   English   中英

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

[英]Best way to use/practice of using parentheses in java

在使用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中编写任何复杂的语句时使用括号的最佳方法是什么。

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

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

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

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

任何建议都会有很大帮助。 我有一些有关此问题的链接,但这些链接没有太大帮助。

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

2中的多余括号是否有用尚待争论-但没有理由不删除1的多余括号。

通常,最好使用多余的括号来传达您对代码应执行的操作的意图,或消除事物发生的顺序的歧义。

这两个版本之间在语义上有所不同:

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

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

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

我同意第2行和第4行无论是否具有多余的花括号都很难阅读。 如果您想清楚,请重写。 话虽如此,多余的花括号有时对清晰度很有帮助,恕我直言,我确实偶尔使用它们。

第一个片段

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

您可以将其重写为:

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

因为字符串连接运算符已经进行了字符串转换。 除非你想有一个ClassCastException时,抛出proxyUsernameproxyPassword不是字符串?

第二段

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();

最好的方法是将要转换的类放在括号中,然后将要转换的整个部分放在另一个括号中,然后将整个代码包含在容器括号中,您的代码应如下所示,例如(((String)( x + y))。

希望对您有所帮助,谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM