Effective Java Item6 避免创建不必要的对象
在需要一个对象时,恰当的做法是尽可能重用这个对象而非创建一个功能完全一样的新对象。重用既比较快又比较流行。如果一个对象是不可变的(Item 17),那么它总是可以被重用的。
在需要一个对象时,恰当的做法是尽可能重用这个对象而非创建一个功能完全一样的新对象。重用既比较快又比较流行。如果一个对象是不可变的(Item 17),那么它总是可以被重用的。
很多类都会依赖于一个或多个底层资源。比如说,拼写检查器会依赖于字典。我们常常会看
到这种类被实现为了静态辅助类(Item 4):
1 | // Inappropriate use of static utility - inflexible & untestable! |
有时,你想要编写一个只包含一组静态方法和静态字段的类。这种类有一个不太好的名声,因为有些人会滥用他们,不从对象的角度来思考,而是坚信他们的想法是正确无误的 。他们可以把原生类型的值或数组相关的方法分一组,就像java.lang.Math
或java.util.Arrays
的方式。还可以将静态方法划分到一起,包括工厂(Item 1),用于实现了某个接口的对象,就想java.util.Collections
一样。(从Java 8开始,如果想要自己修改,那么你还可以将这类方法放到接口中)最后,还可以将针对终态类的方法划分到一起,因为你无法再将他们放到子类中了 。
单例对象是一个仅仅只会实例化一次的类。单例对象通常表示一个无状态对象,例如一个函数(Item 24)或一个本质上惟一的系统组件。使类成为单例会使测试它的客户端变得困难,因为不可能用模拟实现代替单例,除非它实现一个接口作为它的类型。
静态工厂和构造函数有一个共同的限制:它们不能很好地扩展到大量可选参数。考虑一个代表包装食品上出现的营养成分标签的类的例子。这些标签有一些必要的字段,如分量大小、每瓶容量以及每份的卡路里里数,以及超过20个可选的字段——总脂肪,饱和脂肪,反式脂肪,胆固醇,钠,等等。大多数产品只有少数几个可选字段的值为非零值。
一个类允许客户端获取他的一个实例的传统方法是提供一个公有的构造函数。除此之外,还有一个技术,每个程序员都应该掌握。就是一个类提供一个公有的静态工厂方法,这个方法就是一个简单的返回当前类一个实例的静态方法。这里有个来自于Boolean(对原生类型boolean的装箱)类内部实现的简单的例。下面的方法可以将一个原生boolean类型的值转变成一个对Boolean对象的引用:
1 | public static Boolean valueOf(boolean b) { |
这本书的目的是帮助你高效地使用java这门编程语言和它的基本类库:java.lang , java.util, and java.io
和这些包子包下的:java.util.concurrent 和java.util.function 。其它的类库也会时不时地被讨论到。
这本书有90个小项,每一项都表达了一个准则。这些准则是由那些最优秀、最有经验的程序员总结出来的最佳实践。
这些小项松散地被分到11个章节下面,每个章节都涵盖了软件设计的一个广泛的方面。这本书不需要一页一页地读,每一项都是独立的,正正好好。
这些项目被大量交叉引用,因此您可以轻松地在书中计划自己的课程。