zoukankan      html  css  js  c++  java
  • 优化代码值得注意的一些小细节

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

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

  • 相关阅读:
    叉积
    Linux IO模型
    uva10201-dp
    如何在Java内使用Protobuf
    uva10651-记忆化搜索
    ZK的几个常用方式
    uva10304-最优二叉搜索树
    uva590-DP-Always on the run
    Git神操作
    在容器内运行JVM时内存的问题
  • 原文地址:https://www.cnblogs.com/abcwt112/p/5054218.html
Copyright © 2011-2022 走看看