zoukankan      html  css  js  c++  java
  • Java代码优化小结(三)

    (35)对资源的close()建议分开操作
    虽然有些麻烦,却能避免资源泄露。我们想,如果没有修改过的代码,万一XXX.close()抛异常了,那么就进入了catch块中了,YYY.close()不会执行,YYY这块资源就不会回收了,一直占用着,这样的代码一多,是可能引起资源句柄泄露的。而改为下面的写法之后,就保证了无论如何XXX和YYY都会被close掉。

    (36)对于ThreadLocal使用前或者使用后一定要先remove
    当前基本所有的项目都使用了线程池技术,这非常好,可以动态配置线程数、可以重用线程。
    然而,如果你在项目中使用到了ThreadLocal,一定要记得使用前或者使用后remove一下。这是因为上面提到了线程池技术做的是一个线程重用,这意味着代码运行过程中,一条线程使用完毕,并不会被销毁而是等待下一次的使用。我们看一下Thread类中,持有ThreadLocal.ThreadLocalMap的引用。
    线程不销毁意味着上条线程set的ThreadLocal.ThreadLocalMap中的数据依然存在,那么在下一条线程重用这个Thread的时候,很可能get到的是上条线程set的数据而不是自己想要的内容。
    这个问题非常隐晦,一旦出现这个原因导致的错误,没有相关经验或者没有扎实的基础非常难发现这个问题,因此在写代码的时候就要注意这一点,这将给你后续减少很多的工作量

    (37)切记以常量定义的方式替代魔鬼数字,魔鬼数字的存在将极大地降低代码可读性,字符串常量是否使用常量定义可以视情况而定

    (38)long或者Long初始赋值时,使用大写的L而不是小写的l,因为字母l极易与数字1混淆,这个点非常细节,值得注意

    (39)所有重写的方法必须保留@Override注解
    这么做有三个原因:

    • (1)清楚地可以知道这个方法由父类继承而来
    • (2)getObject()和get0bject()方法,前者第四个字母是”O”,后者第四个子母是”0″,加了@Override注解可以马上判断是否重写成功
    • (3)在抽象类中对方法签名进行修改,实现类会马上报出编译错误

    (40)推荐使用JDK7中新引入的Objects工具类来进行对象的equals比较,直接a.equals(b),有空指针异常的风险

    (41)循环体内不要使用”+”进行字符串拼接,而直接使用StringBuilder不断append

    (42)不捕获Java类库中定义的继承自RuntimeException的运行时异常类
    异常处理效率低,RuntimeException的运行时异常类,其中绝大多数完全可以由程序员来规避,比如:

    • ArithmeticException可以通过判断除数是否为空来规避
    • NullPointerException可以通过判断对象是否为空来规避
    • IndexOutOfBoundsException可以通过判断数组/字符串长度来规避
    • ClassCastException可以通过instanceof关键字来规避
    • ConcurrentModificationException可以使用迭代器来规避

    (43)避免Random实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一seed 导致的性能下降,JDK7之后,可以使用ThreadLocalRandom来获取随机数
    多个线程同时获取随机数的时候,会竞争同一个seed,导致了效率的降低。

    (44)静态类、单例类、工厂类将它们的构造函数置为private
    这是因为静态类、单例类、工厂类这种类本来我们就不需要外部将它们new出来,将构造函数置为private之后,保证了这些类不会产生实例对象。

  • 相关阅读:
    国内固定电话正则验证:'tel': [/0d{2,3}-d{7,8}(|([-u8f6c]{1}d{1,5}))$/, "请填写有效的电话号码"],
    戴尔3542安装ubuntu时出现:failed to lead ldlinux.c32
    解决:IntelliJ IDEA 编译错误,提示 Compilation failed: internal java compiler error
    超详细~Windows下PyCharm配置Anaconda环境教程!!
    python数据可视化--matplotlib用户手册入门:pyplot画图
    python数据分析——numpy创建多维数组的方式
    python timeit 模块使用,解决%timeit无法使用
    MySQL导入导出数据的中文乱码问题
    如果启动mysql时候,报第一行错误,基本是这个原因没跑了
    mysql安装后服务启动不了(总结)
  • 原文地址:https://www.cnblogs.com/JackpotHan/p/9585812.html
Copyright © 2011-2022 走看看