SonarQube的部分規則探討


引言:為了更好的使項目代碼規范化,減少Bug的出現,因此最近引入了SonarQube來幫助檢測代碼問題,這里就分享部分有趣的規則。

注:因為保密原則,文章貼出來的代碼都是我按照格式仿寫的,並非公司源碼。

 

一. Boxed value is unboxed and then immediately reboxed

解釋:已裝箱的值被解除裝箱,然后立即重新裝箱。 

示例:

User user = new User();
Long userId = (user.getId() == null)? 0 : user.getId();

這里是拆裝箱問題,int類型的值0,被拆了箱又再裝箱,所以

改進:

User user = new User();
Long userId = (user.getId() == null) ? Long.valueOf(0) : user.getId();

 

二. Method concatenates strings using + in a loop

解釋:在循環的每次迭代中,字符串被轉換為StringBuffer/StringBuilder,附加到字符串,然后再轉換回字符串,

  這可能導致迭代次數的二次成本,因為不斷增長的字符串在每次迭代中重復出現。

  建議使用StringBuffer提高性能,后面是案例。

示例:

List<User> users = new ArrayList<>();
users.add(user1);
users.add(user2);
        
String str = "";
for (User user : users) {
       str += user.getName() + ".";
}

這並不算是Bug,但是確實可能存在性能問題,所以還是得盡可能避免。

改進:

List<User> users = new ArrayList<>(); users.add(user1); users.add(user2);
StringBuffer strBuf = new StringBuffer();
 for (User user : users) {
        strBuf.append(user);
}
String str = strBuf.toString();

 

三. Null pointer dereference

 

解釋:可能出現空指針異常

示例:

if (null != user || name.equals(user.getName())){
         .........
}

這個邏輯判斷就有明顯問題,當 | | 前面為false也就是 user == null 時,會繼續進行判斷,

  於是在后面 user.getName() 就出現了空指針異常

 

四.equals method overrides equals in superclass and may not be symmetric

 

 代碼:

@Data
public class User extends UserCmd {
    private Long id;
    private String name;
    private String code;
    private Integer status;
}

問題:

  問題出現在@Data上,因為這個User類是UserCmd的子類,而@Data處理繼承上需要獨立聲明 callSuper

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM