第1条:用静态工厂方法代替构造器
优势:
I.静态工厂有名称,可以知道方法的用处;
II.不用每次掉用的时候就创建新对象;
III.可以返回子类型对象;
缺点:
I.在没有文档的情况下,很难发现有这个方法
第2条:遇到多个构造器参数时要考虑使用构造器
参数太多情况,有参构造器繁琐且难以阅读,用setter代替。
第3条:用私有构造器或者枚举类型加强Singleton属性
枚举创建单例安全且简单
第4条:通过私有构造器强化不可实例化的能力
工具类这种不需要被实例化的,可以设置私有构造器。
public class UtiltyClass {
/**
* Suppress default constructor for nonessential
*/
private UtiltyClass() {
throw new AssertionError();
}
//...
}
第5条:优先考虑依赖注入来引入资源
不要用 Singleton 和静态工具类来实现依赖一个或多个底层资源的类,且该资源的行为会影响到该类的行为 ;也不要直接用这个类来创建这些资源,而应该将这些资源或者工厂传给构造器(或者静态工厂,或者构建器),通过它们来创建类这个实践就被称作依赖注入,它极大地提升了类的灵活性 可重用性和可测试性。
第6条:避免创建不必要的对象
两个例子:
I.缓存实例,进行重用
static boolean isRomanNumeral (String str) {
return str.matches("regex...");
}
matches的内部为正则表达式创建一个Pattern实例,却只用了一次。为了提升性能,采用下面操作,将Pattern实例缓存起来,进行重用。
public class RomanNumerals {
/**
* 重用一个pattern实例
*/
private static final Pattern ROMAN = Pattern.compile(
"regex...");
static boolean isRomanNumeral (String str) {
return ROMAN.matcher(str).matches();
}
}
II.优先使用基本数据类型,当心无意识的自动装箱操作