第二章 创建和销毁对象
第1条:用静态工厂方法(static factory method)代替构造器
静态工厂方法五大优势:
- 他们有名称;
- 不必再每次调用他们的时候都创建一个新对象;
- 可以返回原返回类型的任何子类型对象;
- 所返回的对象的类可以随着每次调用而发生变化,这取决于静态工厂方法的参数值;
- 方法返回的对象所属的类,在编写包含该景泰工程方法的类时可以不存在;
(构成了服务提供者框架(Service Porvider Framework),服务提供者框架中有三个重要的组件:服务接口(Service Interface)、提供者注册API(Provider Registration API)、服务访问API(Service Access API))
静态工厂方法两大缺点:
- 类如果不含共有的或者受保护的构造器,就不能被子类化;
- 程序员很难发现他们;
列举一些静态工厂方法的惯用名称:
from——类型转换方法
of——聚合方法
valueOf
instance或者getInstance
create或者newInstance
getType
newType
type
第2条:遇到多个构造器参数时要考虑使用构建器
Builder模式灵活,使构造器动态化(模拟了具名的可选参数)
Builder模式可能存在性能问题
第3条:用私有构造器或者枚举类型强化Singleton属性
第4条:通过私有构造器强化不可实例化的能力
public class UtilityClass{
private UtilityClass{
throw new AssertionError(); //保证该类在任何情况下都不可以被实例化
}
}
第5条:优先考虑依赖注入来引用资源
第6条:避免创建不必要的对象
对于同时提供了静态工厂和构造器的对象,优先使用静态工厂创建。构造器会多次创建对象,而静态工厂创建的对象可以复用(对象内容无需改变的情况下)。
第7条:消除过期的对象引用
导致内存泄漏的三种情况:
1、栈中弹出对象不会被当作垃圾回收,因为栈内部维护着这些过期引用:一但不使用,清空对象即可;
2、缓存容易被遗忘:使用WeakHashMap代替缓存、缓存应该定期清除没用的项(LinkedHashMap);
3、监听器和其他回调:注册回调后取消回调、确保回调立即被当作垃圾回收的最佳方法是只保存他们的弱引用(weakreference),例如只将它们保存成WeakHashMap中的键;