第5条:避免建立没必要要的对象

  通常来讲,咱们最好的作法是重用对象,而不是每次使用都new出一个新的相同功能的对象,这样作很高效,特别是对于那些不可变类来讲。看一个极端的反面例子,若是String s = new String("stringette");每次都被执行的话都会建立一个新的实例,然而stringette自己就是String一个实例,功能和构造器建立的对象等,若是这种用法在一个for循环中,或者被频繁调用,那就会创形成千上万个String实例了。所以,使用 String s = "stringette"就不是每次执行的时候都建立一个新的实例,在同一台虚拟机中运行的代码,只要包含相同的字符串字面常量,该对象就会被重用。性能

  如今咱们来看一个例子,好比有一个Person对象,对象中有一个字段是生日,生日是个常量,它不能被更改,如今须要完成一个方法,用这个方法咱们能够获取到这我的是否出生在1946到1964年之间(也就是生育高峰期(baby boomer))this

public class Person {
        private final Date birthday;
        public Person(Date birthday) {
            this.birthday = birthday;
        }

        public boolean isBabyBoomer() {
            Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
            //将时间设置为1946年1月1日0时0分0秒
            c.set(1946, Calendar.JANUARY, 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、两个Date对象实例,这些都是没必要要的,于是,咱们如今对Person进行修改下已达到代码的重用。spa

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"));
            //将时间设置为1946年1月1日0时0分0秒
            c.set(1946, Calendar.JANUARY, 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;
        }
}

  好了,这样就很明显的能够看出,咱们不须要每次都建立新的Calendar和Date对象实例了。code

  建议:若是想要保证性能,则尽可能使用基本数据类型而不是装箱基本类型,要小心无心识的自动装箱。如Integer k = 10;对象

  

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

相关文章
相关标签/搜索