最近在修改项目里一些代码违规问题,都是sonar检测出来的...很多问题都是重复出现...于是现在记录一些我觉得比较重要的和容易犯的问题.
日志
比如我用slf4j,那在类里应该这样声明private static final Logger LOGGER = LoggerFactory.getLogger(XXXX.class)
private static final 3个修饰词都是不可以变的,缺一不可.
LOGGER是可以的,或者改成LOG,这2种是推荐写法.
在一些类中发现有人会这么写private final Logger logger = LoggerFactory.getLogger(getClass())
这样是不规范的.也不必为每个类的实例都创建Logger类的对象
判断集合是否为空
判断集合是否为空的时候有人会这么写list.size() > 0
这样也是不规范的.规范的写法是list.isEmpty()
这样更简洁一些.
Long类型
如果有1个long值需要显示转化成Long对象,有人可能会这么做new Long(long)
这样不是最佳的选择,可以使用Long.valueOf(long)来代替,因为Long是有cache的.
可以参考 这篇文章
另外如果直接使用字面常量的话L是需要大写的,比如使用long num = 1L而不是1l
遍历Map
遍历map有很多种方式.我一直使用的是最简单的那种.
for(String key : map.keySet()){ String value = map.get(key); }
但是其实这样也是有问题的.是个效率问题,这样不如用Entry速度快
替代方法是
for(Map.Entry<String, String> entry : map.entrySet()){ String value = entry.getValue(); String key = entry.getKey(); }
字符串
有些时候需要拼接字符串,现在我想大家String一般是不会直接使用的,可能很多人会使用StringBuffer来代替.
这个时候应该要注意,如果拼接字符串是在方法的内部,StringBuffer是作为局部变量存在的,这个时候没有同步的问题,可以考虑使用StringBuilder来代替,取得更好的效率.
Tab与空格
在编码的建议使用空格代替tab,IDE可以将tab自动替换成空格,因为在不同环境下1个tab到底缩进多少可能有少许不同,但是空格是一样的..虽然我觉得tab比空格好使...因为鼠标可以更简单的定位代码...但是这条规则还是有一些道理的....
if
单个if也是需要些括号的,不然下次增加代码的时候会容易错.虽然eclipse可以格式化代码,方便检查,但还是写上去比较好
抛出异常
throw exception的时候sonar建议throw 你自己定制的exception而不是很高层的exception,可能这样更容易判断到底是什么错误吧.
字符串比较
这一点稍微有一些工作经验的朋友应该都知道,2个字符串比较的时候应该把常量写在前面.
因为字符串常量不会是null,而引用可能是会指向null的.这样做可以避免空指针异常.
方法参数
方法参数在方法的内部应该尽量避免修改,不然可能会影响方法外面的引用..
我个人觉得可以使用Converter来拷贝一份参数.
捕获异常
捕获异常以后要么记录这个异常,要么重新抛出它..而不是什么都不做..不然的话外层可能都不知道这里有异常.
就算在catch块中throw了一个新的异常,最好也能把旧的异常记录下来.不然相当于原本的案发现场就丢失了.
另外最好不要使用ex.printStackTrace();而是使用LOGGER去记录异常,这个道理和不要使用System.out.print还是使用LOGGER一样
字符串与数字比较
假如有1个字符串整数,想和1个数字做比较,可能有人会这么写.
Integer.valueOf(string) < 2000
这样其实多做了1次不必要的装箱与拆箱
valueOf方法会调用parseInt方法,而parseInt方法返回的是int,valueOf返回的是Integer所以会把int装箱成Integer.
然后进行比较,Integer与2000比较的时候又会拆箱成int.所以相当于多做了1次没用的装箱与拆箱.
可以考虑使用Integer.parseInt方法代替valueOf
返回类型为合集与数组的方法尽量避免返回null
如果可以的话可以考虑返回空的集合与数组代替返回null.
比如返回new ArrayList()而不是null
因为有些地方别人遍历数组与集合是采用foreach的形式而不是简单的for
这种情况下遍历null会直接抛出异常,而遍历空的集合与数组却不会.
以上大概就是我最近的一点体会~