Effective Java (5) 避免创建不必要的对象

创建对象有时候是比较昂贵的操作,比如创建数据库连接池。现代虚拟机对于轻量级对象的创建相对而言则简单许多。但无论创建对象的成本是否高昂,都应该避免创建不必要的对象。

有几种创建对象的反模式,都是因为创建不必要对象引起的。

首先是大多数人都知道的创建字符串:

String s = new String("new string")

其次是java.util.Calendar对象:

public class WrongCalendar{
   public void useCalendar(){
      Calendar cal = cal.getInstance();
      ...
   }
}

如果useCalendar调用很频繁,建议将对象抽提成为域变量,省去每次创建Calendar 的实例的麻烦。毕竟Calendar实例的创建也是一个比较重的操作。

第三种反模式和自动个装箱有关:

Long sum = 0L;
for(long i =0;i < Integer.MAX_VALUE;i++){
   sum += i;
}
System.out.println(sum);

这里第三行 sum += i;实际上做了这样的操作:

Long tmpI = new Long(i);
sum  +=  i;
于是Integer.MAX_VALUE次循环就创建了相同次数的Long对象,不知不觉中极大的降低了程序的效率。这也提醒我们,如果无法确定自动装箱是否适用,尽量适用原始类型进行运算。


最后有一点需要提及,避免创建不必要的对象并不代表尽量不要创建对象。特别是不要为了尽量不创建对象而人为的编写一些对象池。JVM已经发展到了可以很好的处理轻量级对象的程度,过分追求对象复用,使用对象池之类的技术,会同时带来一些其他方面的问题,比如控制对象池资源回收、增加代码复杂度等,反而得不偿失。

你可能感兴趣的:(java,对象,创建,effective)