最近公司使用sonar对项目的代码进行检查,并对发现的问题发送到内网邮箱,sonar可以分配人员角色和权限,结合了SVN,将SVN中的最新代码下载下来检查代码后打成war包后部署到tomcat上并启动tomcat
昨天修改了sonar上的问题,如下
1、方法长度过长
修改:将方法中变量较少的代码块放到一个新的方法,参数很多,大概有6-7个,多是String,我开始认为java中所有对象是引用传参,后来对修改后的方法测试发现对于String来时有点特殊,传到方法中的String的值没有被修改,因为String是final的,引用对它来说也没有用,只要对它进行赋值操作时
问题:如何才能将一个方法长度减短,在有大量参数的情况,上述方法不可行,有没有什么好的解决方式。
2、低效的stringbuffer
StringBuffer sb = new StringBuffer();
String str = "abc";
sb.append(str + "def"); //这样做的话就失去了stringbuffer的意义了
//应该将后面的也用append
如果是在循环中就更要避免这样的情况了sb.append(str).append("def");
3、使用entrySet
示例代码:
Map<String, String> map = new HashMap<String, String>();
StringBuffer sb = new StringBuffer();
低效:
for(String key : map.keySet()) {
sb.append(key).append(map.get(key));
}
高效:
for(Entry<String,String> entry : map.entrySet()) {
sb.append(entry.getKey()).append(entry.getValue());
}
4、使用char代替Characters
示例代码:
StringBuffer sb = new StringBuffer();
低效:
sb.append("."); //对于单个字符其实可以不用String,单个字符包括换行符('\n')、回车符('\r')
高效:
sb.append('.'); //使用char替换String,提高内部转换
5、使用private修饰符
将成员属性的修饰符尽可能加上private,提供getter、setter方法
6、多个修饰符的位置不对,不符合JLS
修饰符顺序:
private --> protected --> public --> abstract --> static --> final --> transient --> volatile --> synchronned --> native --> strictfp
7、判断list为空时使用isEmpty,不要使用size与0比较
8、加上final修饰符,避免代码漏洞
9、不适用printStackTrace和system.print,使用log代替