创建和销毁对象

避免创建不必要的对象

重用不可变对象和已经的不会被修改的对象

考虑下面的语句
String s=new String("test")
改进
String s="test"
这个版本只用了一个String 实例,而不是每次执行的时候都创建一个新的实例。而且,它可以保证。对于所有在同一台虚拟机中运行的代码,只要他们包含相同的字符串字面常量,该对象就会被重用。
对于同时提供了静态工厂方法和构造器的不可变类,通常可以使用静态工厂方法而不是构造器,以避免不必要的对象。例如,静态工厂方法Boolean.valueOf(String) 总是优于构造器Boolean(String).构造器在每次被调用的时候都会创建一个新的对象,而静态工厂方法则从来不要求这样做,实际上也不会这样做。
不好的代码:

public class Person {
    private final Date birthDate;
    //DON'T USE THIS  
    public boolean isBabyBoomer() {
    //unnessary 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(1963, Calendar.JANUARY,1, 0, 0, 0);
    DATE boomEnd = gmtCal.getTime();
    return birthDate.compareTo(boomStart) >= 0 && borethDate.compareTo(boomEnd) < 0;
}
}

isBabyBoomer每次被调用的时候,都会新建一个Calendar,一个TimeZone和两个Date实例,这是不必要的
public class Person {
private final Date birthDate;

    private static final Date BOOM_START;
    private static final Date BOOM_END;
    static{
        Calendar gmtCal =
            Calendar.getInstamce(TimeZone.getTimeZone('GMT'));
              gmtCal.set(1946, Calendar.JANUARY,1, 0, 0, 0);
    DATE boomStart = gmtCal.getTime();
    gmtCal.set(1963, Calendar.JANUARY,1, 0, 0, 0);
    DATE boomEnd = gmtCal.getTime();
    }

    public boolean isBabyBoomer() {

    return birthDate.compareTo(boomStart) >= 0 && borethDate.compareTo(boomEnd) < 0;
  }
}

改进后的Person类旨在初始化的时候创建Calaendar、TimeZone和DATE实例一次,而不是每次调用isBabyBoomer的时候都创建这些实例。

如果改进后的Person类被初始化了,它的isBabyBoomer方法却永远不会被调用,那就没有必要初始化BOOM_START 和BOOM_END域

你可能感兴趣的:(创建和销毁对象)