您的位置:首页 > Web前端

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

2014-07-16 21:06 274 查看
创建对象有时候是比较昂贵的操作,比如创建数据库连接池。现代虚拟机对于轻量级对象的创建相对而言则简单许多。但无论创建对象的成本是否高昂,都应该避免创建不必要的对象。
有几种创建对象的反模式,都是因为创建不必要对象引起的。

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

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已经发展到了可以很好的处理轻量级对象的程度,过分追求对象复用,使用对象池之类的技术,会同时带来一些其他方面的问题,比如控制对象池资源回收、增加代码复杂度等,反而得不偿失。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: