如果一个对象是非可变的,那么它在程序中上可以被重用的,如:
//不推荐,"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 读书笔记,第二版自己摘要并翻译,以备速查。
Effective Java读书笔记.pdf
Effective Java Effective Java Effective Java
这是对Effective-Robotics-Programming-with-ROS这本书的中文学习笔记
effectiveJava的笔记
《Effective Java》第三版中文版目录 第一章 介绍 1 第二章 创建和销毁对象 4 1 考虑用静态工厂方法替换构造器 4 2 当遇到多个构造器参
记录了我的effective-Python学习笔记,精简了effective-Python中重要的部分。effective-Python是一本值得多看几遍的书,但是看后面的几遍的时候完全可以直接看自己的学习笔记。此学习笔记侧重与比较实用的部分即前四...
Effective-Java读书笔记,别人分享的
effective-java.pdf
程序设计超级经典书籍 Java 编程语言(第三版)---Java 四大名著----James Gosling(Java 之父) Java 编程思想(第2版)----Java 四大名著----Bruce Eckel Java 编程思想(第3版)----Java 四大名著----------------...
effective-go-zh-en-gitbooke
Effective java 3 学习记录
Effective Enterprise Java
2021年EFFECTIVEJAVA读书笔记.docx
effective-java 配套代码
Effective C++学习笔记 没有时间看Effictive C++书的人可以看看这个笔记 总结出了重点啊 适合有c++基础的人阅读
effective-java-3rd-chinese前51条:文章翻译来源地址:about this repository本来以为只是个直接搬运的活,实际上不是。主要工作如下:改进排版,原有博文排版不太优秀,根据markdown 排版指北重新排版。内容修改,...
Effective Java读书笔记,记载了大部分我觉的有用的东西,前半部分有代码说明,但后半部分的代码,太过琐碎,就没有整理