id squid:S2639
- 描述: Regular expressions are powerful but tricky, and even those long used to using them can make mistakes.
- 問題說明:str.replaceAll(".", “ ”);. 第一個參數是正則表達式,配任何單個字符。在replaceAll中使用,它匹配所有內容,所以所有內容都將會被替換
- 解決方案:寫入正確的正則表達式,如果要替換所有的字符串,就不需要調用,如果只匹配".",可以使用str.replaceAll("\.", “ ”);
id squid:S2119
-
描述: “Random” objects should be reused
-
問題說明:在意個類的多個方法中使用了Random random = new Random(); 應該重用“隨機”對象 隨機數種子在創建一個random對象的時候生成,相同 的隨機數種子,產生相同隨機數的機率非常高
-
解決方案:隨機數定義爲一個屬性,然後在下面的方法裏面生成隨機值
private Random rand = new SecureRandom(); // SecureRandom is preferred to Random public void doSomethingCommon() { int rValue = this.rand.nextInt(); //...
id squid:S2095
-
描述: Resources should be closed
-
問題說明:連接(Connections)、流(Streams)、文件(files)等實現了Closeable接口的類,在使用以後應該關閉,並且所有的關閉都應該放到finally裏面。
-
解決方案:
OutputStream stream = null;
try {
stream = new FileOutputStream(“myfile.txt”);
for (String property : propertyList) {
// …
}
} catch (Exception e) {
// …
} finally {
stream.close();
}
}
try (OutputStream stream = new FileOutputStream(“myfile.txt”)😉{
for (String property : propertyList) {
// …
}
} catch (Exception e) {
// …
}
}
id squid:S2293
-
描述: The diamond operator ("<>") should be used
-
問題說明:Java 7引入了運算符(<>),以減少泛型代碼的冗長性。例如,不必在列表的聲明和構造函數中聲明列表的類型,現在可以使用<>來簡化構造函數聲明,編譯器將推斷該類型。
請注意,當項目的sonar.java.source低於7時,此規則將自動禁用
-
解決方案:省略定義變量後面的列表類型
Map<String,List<Integer>> map = new HashMap<>();
id squid:S1186
-
描述: Methods should not be empty
-
問題說明:方法體爲空,沒有任何實現。方法沒有方法體有以下幾個原因:
這是一個無意的疏忽導致,應該加以糾正,以防止在生產中出現意外行爲。
這個方法還沒有或者永遠不會實現。在這種情況下,應該拋出 UnsupportedOperationException 。
該方法是一個有意爲空的重寫。在這種情況下,嵌套註釋應該解釋空白覆蓋的原因。
-
解決方案:添加註釋說明或者拋出異常
@Override public void doSomething() { // Do nothing because of X and Y. } @Override public void doSomethingElse() { throw new UnsupportedOperationException(); }
id squid:S1604
-
描述 Anonymous inner classes containing only one method should become lambdas
-
問題說明:在Java8之前,在Java中部分支持閉包的唯一方法是使用匿名內部類。但是匿名類的語法看起來很難理解。
在Java 8中,匿名內部類的大多數使用應該被lambdas替代,以高度提高源代碼的可讀性。
請注意,當項目的sonar.java.source低於8時,此規則將自動禁用。
-
解決方案:內部類使用lambdas表達式替換
myCollection.stream().map(new Mapper<String,String>() { public String map(String input) { return new StringBuilder(input).reverse().toString(); } }); Predicate<String> isEmpty = new Predicate<String> { boolean test(String myString) { return myString.isEmpty(); } }
–>
myCollection.stream().map(input -> new StringBuilder(input).reverse().toString()); Predicate<String> isEmpty = myString -> myString.isEmpty();
id squid:S1118
-
描述 Utility classes should not have public constructors
-
問題說明:實用程序類是靜態成員的集合,不應該被實例化。即使可以擴展的抽象實用程序類也不應該有公共構造函數。
Java向每個沒有顯式定義至少一個類的類添加隱式公共構造函數。因此,至少應該定義一個非公共構造函數。
-
解決方案:向工具類中添加一個非公共的構造函數
class StringUtils { // Compliant private StringUtils() { throw new IllegalStateException("Utility class"); } public static String concatenate(String s1, String s2) { return s1 + s2; } }
id squid:S1948
-
描述 Fields in a “Serializable” class should either be transient or serializable
-
問題說明:字符串判斷是否爲空的時候,通常是
if (signPdfRequest.getSysFlag() == null 4|| “”.equals(signPdfRequest.getSysFlag())) {
errors.append(“系統標識不能爲空;”);
}特別是如果有很多,會導致代碼可讀性變差
-
解決方案:改爲一下寫法或者使用註解@Valid
if (StringUtils.isEmpty(signPdfRequest.getSysFlag())) {
errors.append(“系統標識不能爲空;”);
}