如果一个对象是非可变的,那么它在程序中上可以被重用的,如:
//不推荐,"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》是Java开发领域的经典著作,由Joshua Bloch编写,旨在提供一系列实用的编程准则和最佳实践。这本书的第三版包含了大量更新,涵盖了Java语言和平台的新发展,如Java 8和Java 9的新特性。以下是对...
- 工厂方法:介绍工厂方法模式,作为创建对象的抽象接口,提供更大的灵活性。 - 可枚举类型(enum):推荐使用枚举代替常量类,因为枚举具有内置的单例特性且更安全。 2. **第4章 类和接口** - 抽象类与接口:...
5. **《Java讲义第4章》**:通常讲义会按章节划分,第4章可能涉及特定主题,如异常处理、输入输出或集合框架等。这部分内容可能较深入,适合有一定基础的读者进一步提升。 这些书籍结合使用,将提供一个全面且深入...
本资源集合提供了一份完整的“Java学习PDF”,旨在帮助学习者系统地理解和掌握Java编程。 这份PDF教程可能涵盖以下关键知识点: 1. **Java简介**:介绍Java的历史、特点、应用领域以及与其它编程语言的对比,使...
在“学习Java的第二个项目,面试技巧和基础进阶知识”的资源中,我们可以找到一系列关于提升Java编程技能和准备面试的材料。这个压缩包可能包含了笔记、代码示例或者指导文档,帮助学习者巩固基础知识并掌握面试中的...
3. **《Effective Java》第二版(effective-java-2)**:这是Joshua Bloch的经典之作,书中列举了23个编程项,提供了关于如何编写更高效、可读性更强的Java代码的实用建议。它涉及的主题包括枚举类型、泛型、匿名内部...
《JSP&Servlet学习笔记》**(2012):通过作者的学习笔记形式,详细记录了JSP和Servlet的学习过程和心得,适合自学。 7. **刘京华.《JavaWeb整合开发王者归来》**(2010):介绍了JavaWeb开发的各种技术,并且强调了...