`
schumee
  • 浏览: 25856 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Effective Java 学习笔记第4条 --- 避免创建重复的对象

阅读更多

如果一个对象是非可变的,那么它在程序中上可以被重用的,如:

 

//不推荐,"test"本来就是一个String实例,如果此方法在一个循环中或者被频繁的调用,将会严重影响性能
String s = new String("test");

 

//推荐方式
String s = "test";

 

      对于提供静态方法和构造函数的非可变类,推荐使用静态方法,这样可以避免重复创建对象,如:

Boolean.vauleOf(String)方法优于构造函数Boolean(String)

 

如下Person类在每次调用isBabyBoomer()方法时都需新创建对象,极大的影响了性能。

import java.util.*;
public class Person {
    private final Date birthDate;
    public Person(Date birthDate) {
        // Defensive copy - see Item 39
        this.birthDate = new Date(birthDate.getTime());
    }
    // Other fields, methods omitted
    // DON'T DO THIS!
    public boolean isBabyBoomer() {
        // 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;
    }
} 

 

改进方案如下:

 

import java.util.*;
class Person {
    private final Date birthDate;
    public Person(Date birthDate) {
        // Defensive copy - see Item 39
        this.birthDate = new Date(birthDate.getTime());
    }
    // Other fields, methods
    /**
     * 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 isBabyBoomer() {
        return birthDate.compareTo(BOOM_START) >= 0 &&
               birthDate.compareTo(BOOM_END)   <  0;
    }
} 

 

      这样类变量在类在初始化创建Calendar、Date、TimeZone时只需创建一次,已经初始化的不再进行初始化操作,性能好于前一种方法一百倍。【static变量在系统没有调用isBabyBoomer() 方法之前,不会进行初始化(延迟初始化)】


类初始化的顺序:先初始化父类的静态代码--->初始化子类的静态代码-->初始化父类的非静态代码--->初始化父类构造函数--->初始化子类非静态代码--->初始化子类构造函数。

分享到:
评论

相关推荐

    Effective Java读书笔记.pdf

    "Effective Java读书笔记" Effective Java是一本关于Java编程语言的经典书籍,本笔记主要总结了Java语言的发展历程、静态工厂方法的应用、构造器模式的使用等重要知识点。 一、Java语言的发展历程 Java语言的发展...

    effective java 读书笔记

    《Effective Java》是Java开发领域的经典著作,作者Joshua Bloch深入浅出地阐述了编写高效、健壮的Java代码的技巧和最佳实践。以下是对该书部分内容的详细解释: 1. **产生和销毁对象** - Item1:静态工厂方法相比...

    Effective Java第三版1

    6. **避免创建不必要的对象**:对象创建是有代价的,重复创建相同的对象可能导致性能问题,应尽量复用或使用不可变对象。 7. **避免使用终结方法(finalizers)和清理器(cleaners)**:这些机制不可靠且执行时间不...

    effective-java.pdf

    不可变类使用静态工厂方法可以预先构建实例,避免重复创建等价对象。 5. 静态工厂方法与接口的结合 在基于接口的框架中,静态工厂方法可以有效地隐藏实现类,使API更加简洁。这种技术同样适用于集合框架中的实用...

    Effective-Java-2nd-Edition-(May-2008).zip_effective java

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,第二版发布于2008年。这本书旨在提供实用的编程指导,帮助开发者写出更高效、更可维护的Java代码。以下是对书中核心知识点的详细解读: 1. *...

    effective python学习笔记.pdf

    记录了我的effective-Python学习笔记,精简了effective-Python中重要的部分。effective-Python是一本值得多看几遍的书,但是看后面的几遍的时候完全可以直接看自己的学习笔记。此学习笔记侧重与比较实用的部分即前四...

    Effective-Robotics-Programming-with-ROS——中文学习笔记

    ### Effective Robotics Programming with ROS —— 中文学习笔记 #### 知识点一:ROS环境配置与准备工作 **1.1 安装ROS Indigo** 在开始深入学习《Effective Robotics Programming with ROS》之前,首先需要搭建...

    effectiveJava的笔记

    《Effective Java》是Java开发领域的经典著作,由Joshua Bloch编写,旨在提供一系列实用的编程准则和最佳实践。这本书的第三版包含了大量更新,涵盖了Java语言和平台的新发展,如Java 8和Java 9的新特性。以下是对...

    Effective-Java读书笔记

    4. **使用不可变对象**:不可变对象一旦创建就无法改变,这提高了安全性并简化了并发编程。Java标准库中的许多类,如String和BigDecimal,都是不可变的。 5. **重写equals()时务必重写hashCode()**:当一个类重写了...

    Effective-Java读书笔记(上)

    1. **不可变对象**:对于不可变对象,可以通过缓存已创建的对象来避免重复创建。 2. **使用静态工厂方法**:如果一个类既提供了静态工厂方法也提供了构造器,则通常推荐使用静态工厂方法来创建对象,以减少不必要的...

    effective-java 配套代码

    4. **可变与不可变对象(Mutable vs Immutable Objects)**: 通过示例代码展示了如何创建不可变对象,以及不可变对象的益处和实现策略。 5. **泛型(Generics)**: 书中深入讲解了Java泛型的用法,包括类型擦除、...

    Effective Enterprise Java

    通过学习《Effective Enterprise Java》,开发者不仅能掌握Java EE的关键技术和工具,还能理解如何在实际项目中运用这些知识,以解决企业级软件开发中的挑战。这本书是Java EE开发者必备的参考资料,无论你是初学者...

    Effective.Enterprise.Java.中文版 高清pdf 下载

    《Effective Enterprise Java》也不例外,它旨在帮助开发者避免常见的陷阱,提升代码质量,并提高开发效率。书中的每个条目都是一个独立的建议,旨在解决实际开发中遇到的问题,这些条目通常以简洁明了的方式呈现,...

    Effective java 3 学习记录.docx

    Effective Java 3 学习记录 本学习记录主要介绍了 Effective Java 3 中的静态工厂方法和 Builder 模式两部分内容。 一、静态工厂方法 静态工厂方法是指返回类实例的命名规则,例如:from、of、valueOf、instance ...

    effecctivejava 第三版中文

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,现在已经更新到第三版。这本书深入探讨了如何编写高效、可维护且设计良好的Java代码,是每一个Java开发者提升技能的重要参考资料。以下是对该...

    《Effective Java》读书分享.pptx

    静态工厂方法可以返回原类型的任何子类型,且可以将构建好的实例缓存起来,方便重复利用,不用每次调用都创建新对象,从而提高性能。 静态工厂方法的惯用命名包括:from、of、valueOf、instance 或 getInstance、...

    effectiveJava课件分享

    在编程领域,特别是Java开发中,"Effective Java"是一本非常经典的书籍,由Joshua Bloch撰写,书中提出了一系列最佳实践和设计原则,以帮助开发者编写出更高效、更安全的代码。根据提供的标题和描述,我们将探讨三个...

Global site tag (gtag.js) - Google Analytics