[英]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;
因此,讨论此问题的原因是:
实际上,使用大括号/括号是减少混乱的方法,因此为什么要删除这些括号。
在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
时,抛出proxyUsername
或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();
最好的方法是将要转换的类放在括号中,然后将要转换的整个部分放在另一个括号中,然后将整个代码包含在容器括号中,您的代码应如下所示,例如(((String)( x + y))。
希望对您有所帮助,谢谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.