effectiveJava避免创建不必要的对象

Posted Mr_邓

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了effectiveJava避免创建不必要的对象相关的知识,希望对你有一定的参考价值。

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

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

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

  

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被频繁的调用这种方法将会显著地提高性能。

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

 

以上是关于effectiveJava避免创建不必要的对象的主要内容,如果未能解决你的问题,请参考以下文章

创建和销毁对象——避免创建不必要的对象

1避免创建不必要的对象

读书笔记 - Effective Java05. 避免创建不必要的对象

Java:Effective java学习笔记之 避免创建不必要的对象

转载如何在Android中避免创建不必要的对象

避免创建不必要的对象