use/practice 在 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;
尽管我已将上面的行替换为下面的行以保持 Sonar 平静 :) :
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;
所以讨论这个问题的原因是:
实际上使用 braces/parentheses 是减少混淆的方法,所以为什么要删除那些括号。
在 java 中编写任何复杂语句时使用括号的最佳方法是什么。
看到这里的 line>1 和 Line>4 我觉得
(String) (parent.proxyUsername+ ":" + parent.proxyPassword)
这部分代码应该有大括号以避免混淆,但 Sonar 期望的是这样的:
(String) parent.proxyUsername+ ":" + parent.proxyPassword
任何建议都会有很大的帮助。我得到了一些关于这个问题的链接,但这些链接没有太大帮助。
Line 1
有多余的括号,但 Line 2
的括号使三元语句更加清晰。
2
中的额外括号是否有用还有待讨论 - 但没有理由不删除 1
中多余的括号。
一般来说,最好使用额外的括号来表达您对代码应该做什么的意图,或者消除事情发生顺序中的歧义。
最好的方法是将要转换的 class 放在括号中,然后将要转换的整个部分放在另一个括号中,然后将整个代码包含在容器括号中,您的代码应该看起来像这样例如 ((String)(x+y)).
希望对您有所帮助,谢谢。
这两个版本之间存在语义差异:
(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);
因为字符串连接运算符已经进行了字符串转换。除非你想在 proxyUsername
或 proxyPassword
不是字符串时抛出 ClassCastException
?
第二个片段
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();
在使用 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;
尽管我已将上面的行替换为下面的行以保持 Sonar 平静 :) :
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;
所以讨论这个问题的原因是:
实际上使用 braces/parentheses 是减少混淆的方法,所以为什么要删除那些括号。
在 java 中编写任何复杂语句时使用括号的最佳方法是什么。
看到这里的 line>1 和 Line>4 我觉得
(String) (parent.proxyUsername+ ":" + parent.proxyPassword)
这部分代码应该有大括号以避免混淆,但 Sonar 期望的是这样的:
(String) parent.proxyUsername+ ":" + parent.proxyPassword
任何建议都会有很大的帮助。我得到了一些关于这个问题的链接,但这些链接没有太大帮助。
Line 1
有多余的括号,但 Line 2
的括号使三元语句更加清晰。
2
中的额外括号是否有用还有待讨论 - 但没有理由不删除 1
中多余的括号。
一般来说,最好使用额外的括号来表达您对代码应该做什么的意图,或者消除事情发生顺序中的歧义。
最好的方法是将要转换的 class 放在括号中,然后将要转换的整个部分放在另一个括号中,然后将整个代码包含在容器括号中,您的代码应该看起来像这样例如 ((String)(x+y)).
希望对您有所帮助,谢谢。
这两个版本之间存在语义差异:
(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);
因为字符串连接运算符已经进行了字符串转换。除非你想在 proxyUsername
或 proxyPassword
不是字符串时抛出 ClassCastException
?
第二个片段
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();