引言:為了更好的使項目代碼規范化,減少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