Effective Java 学习笔记(5)

来源:互联网 发布:淘宝网的绿知了的价格 编辑:程序博客网 时间:2024/05/01 03:07

尽量复用对象,而不是创建新的对象,特别是当一个对象是immutable(不可改变)的时候。

如String对象,

String s= new String(“String”);   千万不要这样做,因为这里实际上创建了两个对象。

要避免出现这样的情况,

1是可以用静态工厂函数,来解决,如类库中的Boolean.valueOf(“true”),这种方式要优于new Boolean(“true”);

2.是尽量复用对象。

看书中的例子。

public class Person {
          private final Date 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就会创建两个Data对象,一个Calendar对象和TimeZone对象.

改进版:

class Person {
                    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(1965, Calendar.JANUARY, 1, 0, 0, 0);
                       BOOM_END = gmtCal.getTime();
              }
              public boolean isBabyBoomer() {
                            return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;
              }
}

这个改进版把这现两个常量作成了static,这样,只在加载的时候创建对象,以后调用就不产生任何对象。

还一个问题是要注意基本类型和对象的转换。要注意避免写以下的程序。以下会在加和比较的时候创建一个Long对象,这根本不是必要的。

public static void main(String[] args) {
            Long sum = 0L;
            for (long i = 0; i < Integer.MAX_VALUE; i++) {
                   sum += i;
            }
            System.out.println(sum);
}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mutsinghua/archive/2010/01/21/5220033.aspx

原创粉丝点击