美文网首页Effective Java
避免创建不必要的对象

避免创建不必要的对象

作者: 大海孤了岛 | 来源:发表于2017-03-16 15:03 被阅读36次

一般来说,最好能重用对象而不是每次需要的时候就创建一个相同的对象。如果对象是不可变的,它就始终可以被重用。

例子:我们创建一个类,用来检验一个人是否为生育高峰期出生的小孩,即检验这一个是否在1946-1964年期间出生的

public class Person {

    private final Date birthDate;
    //传入出生日期
    public Person(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(1965, Calendar.JANUARY, 1, 0,0,0);
        Date boomEnd = gmtCal.getTime();
        return birthDate.compareTo(boomStart) >= 0 && birthDate.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方法块,创建不可变对象
    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 Person(Date birthDate){
        this.birthDate = birthDate;
    }
    //检验是否处于高峰生育期
    public boolean isBabyBoomer(){
        return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;
    }
}

改进后的Person类只会在初始化的时候创建Calendar,TimeZone和Date实例,而不是每次调用isBabyBoomer的时候都去创建这些实例。

相关文章

  • 条目6:避免创建不必要的对象

    避免创建不必要的对象 避免通过构造函数创建字符串 避免使用String.match方法做正则匹配 避免在循环中频繁...

  • 避免创建不必要的对象

    在编码中尽量减少大对象的使用,创建对象的成本是非常高的。举个栗子: 代码块一 代码块二 在代码块一中我们使用的是l...

  • 避免创建不必要的对象

    第五条:避免创建不必要的对象 1. 简介 一般来说,我们最好的做法是重用对象,而不是每次使用都new出一个新的相同...

  • 避免创建不必要的对象

    一般来说,最好能重用对象而不是每次需要的时候就创建一个相同的对象。如果对象是不可变的,它就始终可以被重用。 例子:...

  • 避免创建不必要的对象

    记住一个原则:能重用对象就不要每次都创建一个新的对象。例一: 字符串常量在JVM常量池中储存。 例二:对于同时提供...

  • 避免创建不必要的对象

    一、错误做法 二、正确做法

  • Android 如何提高代码质量?

    避免创建不必要的对象,尽可能避免频繁的创建临时对象,例如在for循环内,减少GC的次数。 尽量使用基本数据类型代替...

  • 避免创建不必要的“大”对象

    关键点一 在编码过程中,最好是能重用已经建立的对象,而不是每次用到都要新建对象。在这里重用是指对象是不可变的,那就...

  • 1.6:避免创建不必要的对象

    ① 不可变类,采用静态工厂方法 对于不可变类,若同时提供了静态工厂方法和构造器的不可变类,通常可以使用静态工厂而不...

  • 1.6避免创建不必要的对象

    1.6避免创建不必要的对象 1.6.1 ​ 一般来说,最好能重复利用单个对象而不是每次都创建一个一样的对...

网友评论

    本文标题:避免创建不必要的对象

    本文链接:https://www.haomeiwen.com/subject/rnhjnttx.html