创建和销毁对象——避免创建不必要的对象——重用那些已知不会被修改的可变对象。
2015-10-22 16:36
357 查看
除了重用不可变的对象之外,也可以重用那些已知不会被修改的可变对象。
下面是一个比较微妙、也比较常见的反面例子,其中涉及可变的Date对象,它们的值一旦计算出来之后就不再变化。
这个类建立了一个模型:其中有一个人,并有一isBabyBoomer方法,用来检验这个人是否生育1946-1964(生育高峰期)
public class Person {
private final Date birthDate;
}
isBabyBoomer()每次被调用的时候,都会新建一Calendar、TimeZone 和 Date实例一次,这是不必要的。下面的版本用一个静态的初始化器,避免了这种效率低下的情况:
public class Person {
private final Date birthDate;
}
下面是一个比较微妙、也比较常见的反面例子,其中涉及可变的Date对象,它们的值一旦计算出来之后就不再变化。
这个类建立了一个模型:其中有一个人,并有一isBabyBoomer方法,用来检验这个人是否生育1946-1964(生育高峰期)
public class Person {
private final Date birthDate;
[code]public Person(Date birthDate){ this.birthDate = birthDate; } // Don't do this public boolean isBabyBoomer(){ Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0,0); Date boomStart = gmtCal.getTime(); gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0,0); Date boomEnd = gmtCal.getTime(); return birthDate.compareTo(boomStart) >= 0 && birthDate.compareTo(boomEnd) < 0; }
}
isBabyBoomer()每次被调用的时候,都会新建一Calendar、TimeZone 和 Date实例一次,这是不必要的。下面的版本用一个静态的初始化器,避免了这种效率低下的情况:
public class Person {
private final Date birthDate;
[code]private static final Date BOOM_START; private static final Date BOOM_END; public Person(Date birthDate){ this.birthDate = birthDate; } static { Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0); BOOM_START = gmtCal.getTime(); gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0); BOOM_END = gmtCal.getTime(); } public boolean isBabyBoomer(){ return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0; }
}
[code]改进后的Person类只在初始化的时候创建Calendar、TimeZone和Date实例一次,而不是在每次调用isBabyBoomer()的时候的欧创建这些实例。 如果isBabyBoomer()方法被频繁地调用,这种方法将会显著地提高性能。
相关文章推荐
- 如何计算代码新增行数
- C++ explicit关键字的作用
- 网站开发进阶(一)Tomcat域名或IP地址访问方式配置方法
- Spring mvc之提交表单
- oracle pl/sql之在java中调用无参的oracle存储过程
- 基于HTTP在互联网传输敏感数据的消息摘要、签名与加密方案
- MyEclipse和Eclipse中jsp、html格式化自动排版问题
- Hadoop文件操作
- oracle 10g 开归档后的RMAN备份试验
- MVC5+EF6+BootStrap3.3.5 博客系统之项目搭建(一)
- 词法分析实验总结
- 深入学习JavaScript对象
- FMDB的基本使用
- 安卓开发常用知识手册
- 浏览器地址各个参数之间的秘密
- unity5.0正式发布了,看看带来哪些重要的新特性!
- 如何将int型转换成字符型
- javascript 构造函数方式定义对象
- HDOJ 1064 Financial Management
- ios NSUserDefaults存储数据(偏好设置)