第2章 创建和销毁对象
第1条:用静态工厂方法代替构造器
优势:
可以有名称更易于阅读;
不必再每次调用他们的时候都创建一个行的对象;
可以返回原返回类型的任何子类型的对象;
在创建参数化类型实例的时候,他们是代码变得更加简洁;
缺点:
类如果不含public或者protected的构造器,就不能被子类化;
他们与其他静态方法实际上没有任何区别;
第2条:遇到多个构造器参数时考虑使用builder
优势:
提高代码的可读性;
保证创建对象的不可变的安全性;
可扩展性;
缺点:
略微增加开销;
第3条:用私有构造器或者枚举类型强化Singleton属性
完美单例实现方式:
public class Singleton {
private Singleton() {
}
public static Singleton getInstance() {
return SingletonBuilder.mSingleton;
}
private static class SingletonBuilder {
private static final Singleton mSingleton = new Singleton();
}
}
第4条:通过私有构造器强化不可实例化的能力
即所谓的工具类,不需要创建实例,仅仅使用静态方法。
public class Util {
private Util() {
//反射保护
throw new RuntimeException("this class can't be instantiated");
}
}
第5条:避免创建不必要的对象
不必考虑“小”对象,仅当创建一个对象的代价非常昂贵时才避免重复创建。
1.适时使用成员变量代替局部变量
假设一个方法经常被调用,并且在方法体内会创建“不变”的局部变量,这种情况则可以将这些局部变量变为成员变量,并在适当的时候初始化。
2.使用对象池
但要注意只有非常重量级的对象才有必要使用对象池!
缺点:维护复杂,增加内存占用,损害性能。
第6条:消除过期的对象引用
当一个对象不再使用时,及时清除引用,否则会导致内存泄露。
特别注意一下三种情况:
类是自己管理内存时,如集合的存储对象;
容易被遗忘的缓存;
监听和回调,设置监听,却没有显式的取消注册,则listener对象会一直被持有引用。可以采用弱应用来保存listener;