引言:为了更好的使项目代码规范化,减少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