SONAR代碼掃描部分問題總結

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(“系統標識不能爲空;”);
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章