`
aqxyjay
  • 浏览: 4118 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

EJ.05 避免创建不必要的对象

    博客分类:
  • EJ
 
阅读更多
  • 重用对象而不是每次都创建一个相同功能的对象

极端的反面例子,每次执行都会创建一个新的String实例:

 

String s = new String("stringette");  // DON'T DO THIS!

 建议:

String s = "stringette";

 

 

  • 不可变类通常可以使用静态工厂方法来避免创建不必要的对象
遗留任务:
  1. Boolean.valueOf(String)总是优先于构造器Boolean(String),确认valueOf的实现;
  2. Boolean b = true,确认语句的实现,是否会创建对象。
  • 重用那些已知不会被修改的可变对象
反面的例子,方法每次调用都会创建一个Calendar、一个TimeZone和两个Date对象:
public class Person {
    private final Date birthDate;
    
    // Other fields, methods, and constructor omitted
    // DON'T DO THIS!
    public boolean isBabaBoomer() {
        // Unnecessary allocation of expensive object
        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;
    }
}
 建议:
public class Person {
    private final Date birthDate;
    // Other fields, methods, and constructor omitted
    /**
     * The starting and ending dates of the baby boom
     */
    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, 1, 0, 0, 0);
        BOOM_END = gmtCal.getTime();
    }
    public boolean isBabaBoomer() {
        return birthDate.compareTo(BOOM_START) >= 0
                && birthDate.compareTo(BOOM_END) < 0;
    }
}
 
  • 针对某个特定对象的特定适配器情形,不需要创建多个适配器实例(见EJ p19例,Map接口的keySet方法)
  • 注意自动装箱,优先使用基本类型,当心无意识的自动装箱

 

    // Hideously slow program! Can you spot the object creation?
    public static void main(String[] args) {
        Long sum = 0L;
        for (long i = 0; i < Integer.MAX_VALUE; i++) {
            sum += i;
        }
        System.out.println(sum);
    }

 遗留任务:学习自动装箱。

 

 

  • 小对象的创建和回收动作是非常廉价的
  • 非常重量级的对象可以使用对象池(object pool),如数据库连接
遗留任务:
        学习EJ.39时,注意“保护性拷贝(defensive copying)”的内容,并总结两者的区别。
分享到:
评论

相关推荐

    TheThridJE~EJ.zip

    TheThridJE~EJ.zipTheThridJE~EJ.zipTheThridJE~EJ.zipTheThridJE~EJ.zipTheThridJE~EJ.zipTheThridJE~EJ.zipTheThridJE~EJ.zipTheThridJE~EJ.zipTheThridJE~EJ.zipTheThridJE~EJ.zipTheThridJE~EJ.zip

    Eijiro V86 JE~EJ.zip.001Eijiro V86 JE~EJ.zip.001

    Eijiro V86 JE~EJ.zip.001Eijiro V86 JE~EJ.zip.001Eijiro V86 JE~EJ.zip.001Eijiro V86 JE~EJ.zip.001Eijiro V86 JE~EJ.zip.001

    Eijiro V86 JE~EJ.zip.006

    Eijiro V86 JE~EJ.zip.006Eijiro V86 JE~EJ.zip.006Eijiro V86 JE~EJ.zip.006

    Eijiro V86 JE~EJ.zip.005Eijiro V86 JE~EJ.zip.005

    Eijiro V86 JE~EJ.zip.005Eijiro V86 JE~EJ.zip.005Eijiro V86 JE~EJ.zip.005Eijiro V86 JE~EJ.zip.005

    Eijiro V86 JE~EJ.zip.002Eijiro V86 JE~EJ.zip.002

    Eijiro V86 JE~EJ.zip.002Eijiro V86 JE~EJ.zip.002Eijiro V86 JE~EJ.zip.002

    Eijiro V86 JE~EJ.zip.004Eijiro V86 JE~EJ.zip.004

    Eijiro V86 JE~EJ.zip.004Eijiro V86 JE~EJ.zip.004

    Eijiro V86 JE~EJ.zipEijiro V86 JE~EJ.zip

    Eijiro V86 JE~EJ.zipEijiro V86 JE~EJ.zip

    ej.rar_c/C++

    标题中的"ej.rar_c/C++"表明这是一个与C++编程语言相关的压缩文件,而"ej.c"可能是包含C语言代码的源文件。描述提到的是一个能在DOS环境下操作光驱的C程序,这意味着我们将探讨如何在DOS操作系统下通过C语言控制硬件...

    Aspnet-ej2-aspmvc-ej1compatibility.zip

    Aspnet-ej2-aspmvc-ej1compatibility.zip,此演示旨在避免在asp.net mvcsyncfusion essential js 1和essential js 2 asp.net mvc兼容性中出现essential js 1和essential js 2兼容性问题。,asp.net是一个开源的web框架...

    EJ.Technologies.Perfino.3.2.1.x64

    本地会话实时分析模式 Profiler能够根据用户定义的启动方式进行设置。用户即刻便能从设置好的JVM中看到实时数据。用户还可以无需自定义,直接从多...用户可使用编程的命令行比较工具或ant task比较工具创建对比报告。

    ej4B.rar_Time

    【ej4B.rar_Time】是一个关于使用时间中断的示波器程序的压缩包,其中包含三个文件:ej4B.c、ej4B.h和ej4B.uir。这个项目主要探讨了在嵌入式系统或微控制器编程中如何利用时间中断来实现示波器功能,这对于电子...

    11 EJ1820使用手册.pdf

    DeviceNet对象列表包括Class0x01的识别对象(IdentityObject),Class0x02的消息路由对象(MessageRouterObject),Class0x03的设备对象(DeviceNetObject),Class0x05的连接对象(ConnectionObject),Class0x9A的配置对象...

    EJ511_Datasheet_rev0.97.pdf

    【EJ511 USB3.1 Gen1 视频捕获集成电路】 EJ511是一款专为USB3.1 Gen1视频捕捉设计的集成电路,由Etron Technology, Inc.开发。USB3.1 Gen1是USB 3.0规范的一部分,提供最高5Gbps的数据传输速率,比USB2.0的480Mbps...

    Matlab_based_DIC_code___Version_1___130814_EJ.zip_DIC speckle pa

    Digital Image Correlation (DIC) is an optical, non-contact method to measure full-field displacements and strains. The only requirement is that the test specimen has a random speckle pattern on its ...

    EJ080NA-05B Pre- SPEC(V01), 20110428 (1)(1).pdf

    本规格书描述的是群创公司(CHIMEI INNOLUX DISPLAY CORPORATION)生产的一款8英寸液晶显示模组,型号为EJ080NA-05B,该规格书为预发布版本,日期为2011年4月28日,版本号为01。 2. 液晶屏基本规格: - 屏幕大小为...

    EJ_Technologies_JProfiler_11.0.1_macOS_Downloadly.ir.rar

    2. 性能优化:通过CPU分析,识别耗时操作,优化算法或减少不必要的计算。 3. 并发问题:在多线程环境中,定位和解决死锁、阻塞等问题。 4. 数据库性能:监控SQL查询,优化数据库访问速度,提升整体应用性能。 ...

    EJ.COM

    在DOS下弹出CD-ROM的小程序,需要先加载MSCDEX.

    ej_2000.zip

    这个压缩包中的模型是用户额外分享的,不是STK安装文件自带的,这意味着它们可能是由社区成员或专业人员创建的自定义模型,以扩展STK的默认功能。 描述中提到,这个模型属于"air"类别,暗示这可能是一个与航空航天...

Global site tag (gtag.js) - Google Analytics