优化代码值得注意的一些小细节

最近在修改项目里一些代码违规问题,都是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会直接抛出异常,而遍历空的集合与数组却不会.

 

以上大概就是我最近的一点体会~

 

posted @ 2015-12-17 15:05  abcwt112  阅读(335)  评论(0编辑  收藏  举报