你的位置:首页 > Java教程

[Java教程]【Effective Java】3、避免创建不必要的对象


创建对象的时候,有些变量可以一直保持的时候,可以不必要每次实例化对象的时候都把这些变量初始化一遍,可以使用静态和静态块的方式把这些变量的数据固定下来

package cn.xf.cp.ch02.item5;import java.util.Calendar;import java.util.Date;import java.util.TimeZone;/** * *功能:一般情况下创建对象的写法 *时间:下午9:27:25 *文件:PersonSlow.java *@author Administrator * */public class PersonSlow{  private final Date birthDate;    public PersonSlow(Date birthDate)  {    this.birthDate = new Date(birthDate.getTime());  }    /**   * 在固定的时间区间内   * @return   */  public boolean isBetweenTheDate()  {    //获取对应GMT时间标准下的这段代码程序开始运行的时间,TimeZone.getTimeZone("GMT")    Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));    //吧时间设置到相应的位置    gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);    Date timeStart = gmtCal.getTime();    gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);    Date timeEnd = gmtCal.getTime();        return birthDate.compareTo(timeStart) >= 0 && birthDate.compareTo(timeEnd) < 0;  }}

 

把上面的代码改进到使用静态代码块的模式

package cn.xf.cp.ch02.item5;import java.util.Calendar;import java.util.Date;import java.util.TimeZone;public class PersonFast{  private Date birthDate;    //在类初始化的时候就把起始时间和结束时间确定好  private static final Date BOOM_START;  private static final Date BOOM_END;    public PersonFast(Date birthDate)  {    this.birthDate = new Date(birthDate.getTime());  }    //通过静态代码块来实现和类一起初始化之后不在改变  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 isBetweenDate()  {    return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;  }}

这样的话每次创建对象的时候,调用方法使用的私有变量都是最开始初始化好了的,如果调用这个方法的用户特别多,上千万个的话,那么这个方式的优势就体现出来了