effectiveJava(4)避免创建不必要的对象

  一般来说,最好能重用对象而不是在每次需要的时候就创建一个相同功能的新对象。重用方式既快速,又流行。如果对象是不可变得,它就始终能被重用。

  对于同事提供了静态工厂方法和构造器的不可变类,通常使用静态工厂方法而不是构造器,以避免创建不必要的对象。  

  对于一直不会被修改的可变对象,也可以重用。对比如下两个类:

  

import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Person1 {
    private final Date birthDate;


    public Person1(Date birthDate) {
        this.birthDate = birthDate;
    }

    public boolean isBabyBoomer() {
        Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
        Date boomStart = gmtCal.getTime();
        gmtCal.set(1964, Calendar.JANUARY, 1, 0, 0, 0);
        Date boomEnd = gmtCal.getTime();
        return birthDate.compareTo(boomStart) >= 0 && birthDate.compareTo(boomEnd) < 0;
    }
}
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Person1 {
    private final Date birthDate;

    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(1964, Calendar.JANUARY, 1, 0, 0, 0);
        BOOM_END = gmtCal.getTime();
    }

    public Person1(Date birthDate) {
        this.birthDate = birthDate;
    }

    public boolean isBabyBoomer() {
        return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;
    }
}

   第二种Person类只在初始化的时候创建Calendar,TimeZone和Date实例一次,而不是在每次调用isBabyBoomer的时候都创建这些实例。若isBabyBoomer被频繁的调用这种方法将会显著地提高性能。

  优先使用基本类型而不是装箱基本类型。注意无意识的自动装箱。

猜你喜欢

转载自www.cnblogs.com/dgq-blog/p/8979672.html