第一条:考虑用静态工厂方法代替构造器
示例:
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
优势:
- 他们有名称。
- 不必在每次调用他们的时候都创建一个新对象。
- 他们可以返回原返回类型的任何子类型的对象。
- 在创建参数化类型实例的时候,它们使代码变得更加简洁
缺点:
- 类如果不含公有的或者受保护的构造器,就不能被子类化。
- 它们与其他的静态方法实际上没有任何区别。
第二条:遇到多个构造器参数时要考虑用构建器
第三条:用私有构造器或者枚举类型强化Singleton属性
第四条:通过私有构造器强化不可实例化的能力
第五条:避免创建不必要的对象
String str=new String("abc"); //don't do this;
//abc已经是一个String的对象了,改正后为:
String str="abc";
第六条:消除过期的对象引用
- Heap剖析工具:Heap Profier
- java.lang.ref:提供了引用对象类,与垃圾回收器之间的交互
部分代码,示例:
private Object[] elements;
private int size=0;
public Object pop(){
if(size==0){
throw new EmptyStackException();
}
Object result = elements[--size];
elements[size]=null;
return result;
}
第七条:避免使用终结方法
如果子类覆盖了finalize()方法,那需要记得在子类的finalize()中调用super.finalize();
但通常我们会忘记,所以有一个终结方法守卫者,已确保即使子类的终结方法未调用super.finalize()该终结方法也会被执行,如下例:
public class Parent {
public static void main(String[] args) throws Exception{
Parent son=new Son();
son=null;
System.gc();
Thread.sleep(5000);
}
private final Object protectFinalize=new Object(){
protected void finalize() throws Throwable {
System.out.println("Parent finalize by protect");
}
};
@Override
protected void finalize() throws Throwable {
System.out.println("Parent finalize by itself");
}
}
public class Son extends Parent {
@Override
protected void finalize() throws Throwable {
//super.finalize();
System.out.println("Son finalize by itself");
}
}