第2章 创建和销毁对象
1. 考虑用静态工厂方法代替构造器
静态工厂相比构造器的优点来说如下:
- 有名称
- 不必每次创建一个新对象
- 可以返回子类型
- 创建参数化的实例使代码变得简单
缺点:
- 类如果不含有公有的或者受保护的构造器,(即构造器为private),就不能被子类化
- 与其他的静态方法实际上没有任何区别
2. 构造器过多,则考虑使用Builder
这里构造器的参数获取构造器过多,则需要考虑使用Builder模式来生成对象。
在使用Class.newInstance的时候,会企图调用类的无参构造函数,若没有无参构造函数,则会抛出异常。也就是说,Class.newInstance破坏了编译时的异常检查。而使用Builder则不会有这个问题。
3. 用私有构造器或者枚举来强化Singleton
- 使用私有构造器时,需要注意唯一实例的判断,因通过反射是可以调用私有构造器的。
- 在使Singleton类变成可序列化的时候,需生命所有实例域都是瞬时的(transient),并提供一个readResolve方法。
- 实现只包含单一元素的枚举类型,无偿地提供了序列化机制
单元素的枚举类型已经成为实现Singleton的最佳方法
4. 通过私有构造器强化不可实例化的能力
若一个类我们不希望他被实例化,则尽量提供一个私有的构造器,并提供注释说明,在其中抛出异常也是可以的。
5. 避免创建不必要的对象
- 若能重用一些对象,例如不可能变的对象和不会被修改的可变对象,则尽量重用,而不是新建。
- 要优先使用基本类型而不是装箱基本类型,当心无意识的自动装箱。
6. 消除过期的对象引用
- 好处一,当错误引用时,会抛出异常,而不是错误地执行下去。
类自己管理内存,就会出现内存泄露:
- 缓存
- 缓存项的生命周期地不确定性
- 监听器和其他回调
7. 避免使用终结方法
- Java语言规范不能保证终结方法会被及时执行和被执行。
- 不应该依赖终结方法来更新重要的持久状态。