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

避免创建不必要的对象

作者: 想飞的僵尸 | 来源:发表于2016-06-25 17:26 被阅读103次

    第五条:避免创建不必要的对象


    1. 简介

    一般来说,我们最好的做法是重用对象,而不是每次使用都new出一个新的相同功能的对象,这样做很高效,特别是对于那些不可变类来说。

    2. 例子

    引用书中的一个很好的例子:比如有一个Person对象,对象中有一个字段是生日,生日是个常量,它不能被更改,现在需要完成一个方法,用这个方法我们可以获取到这个人是否出生在1946到1964年之间(也就是生育高峰期(baby boomer)),你会怎么做呢?
    像下面这样?:

    public class Person {
            private final Date birthday;
            public Person(Date birthday) {
                this.birthday = birthday;
            }
    
            public boolean isBabyBoomer() {
                Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
                c.set(1946, Calendar.JANUARY, 1, 0, 0, 0);//将时间设置为1946年1月1日0时0分0秒
                Date boomStart = c.getTime();
                c.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
                Date boomEnd = c.getTime();
                return birthday.compareTo(boomStart) >= 0 && 
                                  birthday.compareTo(boomEnd) < 0;
            }
    }
    

    isBabyBoomer在每次调用的时候都会创建一个Calendar 一个TimeZone和两个Date实例,这些都是不必要的,下面是改进版本:

    public class Person {
            private final Date birthday;
    
            private static final Date BOOM_START;
            private static final Date BOOM_END;
    
            public Person(Date birthday) {
                this.birthday = birthday;
            }
    
            static {
                Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
                c.set(1946, Calendar.JANUARY, 1, 0, 0, 0);//将时间设置为1946年1月1日0时0分0秒
                BOOM_START = c.getTime();
                c.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
                BOOM_END = c.getTime();
            }
    
            public boolean isBabyBoomer() {
                return birthday.compareTo(BOOM_START) >= 0 && 
                              birthday.compareTo(BOOM_END) < 0;
            }
    }
    

    3. 如果想要保证性能,则请尽量使用基本数据类型。

    每次自动装箱(autoboxing)都会穿件一个多余的对象,比如:

    Integer value = 0;
    

    上面这段代码就是自动装箱,每次这样做都会穿件一个多余的Integer对象。


    总结

    本条的重点是避免创建多余的对象,提高重用性,但是需要注意对象的重用不能是盲目的,对于对象的重用,我们应该把目光集中在那些重量级的类,或是构造方法中需要做很多初始化的类的身上。对于一些比较轻量级的类,我们应该将代码的简洁和可维护性放在跟高的优先级上。

    相关文章

      网友评论

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

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