《Effective Java》 读书笔记(六)避免创建不必要的对象
java 有很多修饰类的属性的关键字:常用的static,final
说说final和static吧,平时在编程的时候,这两个关键字很多时候都觉得可有可无,最多的时候就是他们俩同时出现----定义常量的时候,其他时候:1.感觉没有对程序正常运行有任何影响 2.不使用这两个关键字看起来也没什么毛病.
这就是程序员和工程师的区别吧,迈出这一步,写出精品代码:
1.定义一个类的属性的时候,认真考虑这个属性是可变的还是所有对象通用的。将所有对象通用的属性添加static关键字。
下面来看一个实例:
判断一个字符串是否为一个有效的罗马数字:
static boolean isRomanNumeral(String s) { return s.matches("^(?=.)M*(C[MD]|D?C{0,3})" + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$"); }
程序看起来很简洁,但是每次调用这个方法都会创建一个新的Pattern实例,并且只使用一次。
修改为以下版本:
public class RomanNumerals { private Pattern roman= Pattern.compile( "^(?=.)M*(C[MD]|D?C{0,3})" + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$"); static boolean isRomanNumeral(String s) { return roman.matcher(s).matches(); } }
Effective Java 中提到,在作者电脑上,最开始的方案 输入一个8个字符的字符串需要1.1微妙,但是给roman属性加上static final字段后,输入8个字符字需要0.17微秒,速度提高了6.5倍。
2.优先使用基本类型而不是装箱的基本的类型,装箱的基本的类型是一个对象,每次使用可能都会新建一个对象。
总之,当程序能够重用一个现有的对象的时候,不要创建一个新的对象,但是, 不能过分的追求不创建新的对象,因为创建一个对象和独享的垃圾回收是非常廉价的,相反,如果自己维护自己的对象池,将会使得程序非常麻烦。
考虑一个度:就好Effective Java 中提到:当你应该重用一个现有的对象的时候,不要创建一个对象,当你应该创建一个新的对象的时候,不要重复使用现有的对象。