避免创建重复的对象:
public class Person {
private final Date birthDate;
//Other fields omitted
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,10,0,0,0);
Date boomEnd = gmtCal.getTime();
return birthDate.compareTo(boomStart) >= 0 &&
birthDate.compareTo(boomEnd) < 0 ;
}
public static void main(String[] args) {
;
System.out.println(new Person(new Date()).isBabyBoomer());
}
}
isBabyBoomer每次被调用的时候,都会创建一个新的Calendar、一个新的TimeZone和两个新的Date实例,这是不必要的。下面的版本用一个静态的初始化器(initalizer),避免上面例子的低效率:
public class Person {
private final Date birthDate;
//Other fields omitted
public Person(Date birthDate){
this.birthDate = birthDate;
}
private static final Date BOOM_START ;
private static final Date BOOM_END;
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,10,0,0,0);
BOOM_END = gmtCal.getTime();
}
public boolean isBabyBoomer1(){
return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;
}
}
改进版本的Person类仅在初始化的时候创建Calendar,TimeZone和Date实例一次,而不是每次isBabyBoomer被调用的时候创建它们。
如果isBabyBoomer方法永远不会被调用,那么Person类的改进版本就没有必要去初始化BOOM_START和BOOM_END域。通过迟缓初始化(Lazy initalizing)将这些域的初始化推迟到isBabyBoomer方法第一次被调用的时候,则有可能消除这些不必要的初始化工作,但不推荐这样做。如迟缓初始化(Lazy initialization)中常见的情况一样,这样做会使方法的实现更加复杂,从而无法获得性能上的显著提高。
分享到:
相关推荐
并发垃圾处理器在Android 2.3中引入,但是总是应该避免不必要的工作,因此应该在不必要的时候避免创建对象实例。 在编程开发中,内存的占用是我们经常要面对的现实,通常的内存调优的方向就是尽量减少内存的占用。 ...
对象池通过对象复用的方式来避免重复创建对象,它会事先创建一定数量的对象放到池中,当用户需要创建对象的时候,直接从对象池中获取即可,用完对象之后再放回到对象池中,以便复用。这种方式避免了重复创建耗时或耗...
服务器端避免表单的重复提交,利用同步令牌来解决重复提交的基本原理如下:(1)用户访问提交数据的页面,服务器端在这次会话中,创建一个session对象,并产生一个令牌值,将这个令牌值作为隐藏输入域的值,随表单一起发送到...
第一种模式:工厂方式 代码如下: var lev=function()...在函数中定义对象,并定义对象的各种属性,,虽然属性可以为方法,但是建议将属性为方法的属性定义到函数之外,这样可以避免重复创建该方法 2.引用该对象的时候,这
Remodel是一种工具,可通过生成支持编码,值比较和不变性的Objective-C模型来帮助iOS和OS X开发人员避免重复代码。 有关Remodel的更多信息,请参见我们的。 安装 $ npm install -g remodel-gen 用法 为了创建一个新...
这个函数可以帮助我们避免重复编写代码,提高代码的复用性和可维护性。 在Python中,拷贝构造函数是一种特殊的构造函数,它可以接受一个已有的对象作为参数,并将其值复制到新的对象中。这个函数通常被用来创建一个...
这样我们如果把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作。接下来将为大家讲解在JS中面向对象的实现。 工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,而由于在...
一个示例可能是根据从数据层返回的数据对象为UI创建表示对象。 您可能最终会编写如下所示的代码: Presentation p = new Presentation(); p.UserName = user.Name; p.AccountType = user.Type; // ... 40 other ...
Visual Basic(VB)代码优化是一个涉及多个方面的综合过程,旨在提高程序的性能、可读性和维护性。以下是一些常见的VB代码优化技巧和总结: ...8. **延迟加载对象**:仅在需要时才创建对象,避免过早初始化。
当数据库表比较多的时候,重复的创建pojo对象和简单的数据库表的(CRUD)操作的mapper,效率低,官方给出了使用mybatis Generator用来根据数据库表逆向生成pojo和mapper文件,极大的方便开发。
这样可以提高代码的可维护性和可读性,同时避免代码的重复。控制反转(Inversion of Control,IoC):Spring的IoC容器负责管理对象的生命周期和依赖关系,而不是由开发者手动创建对象。这种控制反转的设计模式降低了...
核心数据样本应用 使用Swift的适用于iOS和OSX的...如何在用户首次运行该应用程序实例时处理填充数据库中的种子数据,以及如何在安装该应用程序并在另一台设备上运行该应用程序时避免创建重复项 如何创建tableView并使
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 17、...
第二十三计:避免重复代码 15 第二十四计:增加注释 16 第二十五计:函数体最多不超过100行 16 第二十六计:使用语言的修饰符确保变量的不可变性 17 第二十七计:对象状态共享 17 第二十八计:用对象代替普通常量 17...
19,责任链模式:是多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 20,简单工厂模式的最大优点在于工厂类中包含了必要的判断逻辑,根据客户端的选择条件动态实例化相关的类,对于客户端...
3. 代码重用:存储过程可以在不同的应用程序中被调用和重复使用,避免了重复编写相同的数据库操作代码。 4. 简化维护:将复杂的业务逻辑封装在存储过程中,使得数据库逻辑与应用程序逻辑分离,易于管理和维护。 ...
2.15 用类文件对象适配真实文件对象 83 2.16 遍历目录树 84 2.17 在目录树中改变文件扩展名 85 2.18 从指定的搜索路径寻找文件 86 2.19 根据指定的搜索路径和模式寻找文件 87 2.20 在Python的搜索路径中寻找...
这些增强功能的主要功能是可以避免重复分配的和在大量异步套接字 I/O 内进行同步的对象。 当前实现的 Begin/End 设计模式 System.Net.Sockets.Socket 类需要 System.IAsyncResult 对于每个异步套接字操作分配对象。 ...
首页底部按钮的Demo 主要是Fragment的几个实用技术点 一、Fragment页面状态保存方式。 二、解决重新跳转回含有若干个Fragment的Activity时,指定显示第几...三、实现底部首页四个按钮的Fragment避免重复创建对象方法。
R图转换为表 3-2 如何将E-R图转换为表数据规范化 仅有好的RDBMS并不足以避免数据冗余,必须在数据库的设计中创建好的表结构 Dr E.F.codd 最初定义了规范化的三个级别,范式是具有最小冗余的表结构。这些范式是:第一...