`

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

阅读更多

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

1, 有个一典型的例子

String s=new String(“a”);

这个语句每次都都创建一个新的string实例。但是这没有必要。你可以这么写。

String s=”a”;

这样就避免了创建一个新的string实例。

2, 对于同时提供了静态工厂方法和构造器的不可变类,通常可以使用静态工厂方法而不是构造器,以避免创建不必要的对象。构造器在每次调用的时候都会创建一个新的对象,而静态工厂方法则从来不要求这么做,实际上也不会这样做。

3, 请使用static方法和static变量来表示定值的数据,这样可以有效的避免重复创建定值的对象。

4, 如果在一个类中,需要使用静态方法实例的方法,并没有使用静态方法,那么你可以考虑延迟初始化(lazily initializing,但是这么做会让实现复杂化,也会影响性能。

5, 我们讨论不创建重复对象,显然这个对象是不可变的,是可以重用的。但是有些情况并不这么明显。例如适配器(adapter)的情形,有时也叫做视图(view),适配器就是指这样一个对象:它把功能委托给一个后备对象(backing object),从而为后备对象提供一个可以替代的接口。由于适配器除了后被对象之外,没有其他的状态信息,所以针对某个给定对象的特定适配器而言,它不需要创建多个适配器实例。

例如,Map接口的keySet方法返回该Map对象的Set视图,其中包含该Map中的所有键(key),好像每次调用keySet都应该创建一个新的Set实例,但是对于一个给定的Map对象,实际上每次调用keySet都返回同样的Set实例。因为他们由同一个Map实例支撑。

6, jdk1.5中,有一个创建多余对象的新方法,叫做自动装箱(autoboxing),注意,要优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱。

7, 对于小对象的创建,其代价是很廉价的。

8, 重用对象需要付出的代价要远远大于因创建重复对象而付出的代价,必要时如果没能实施保护性拷贝,将会导致潜在的错误和安全漏洞,而不必要的创建对象则只会影响程序的风格和性能。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics