注:这里只做总结。代码和实例请看书。
创建和销毁对象
1 考虑用静态工厂方法替换构造器
传统的获取类的对象是通过公有构造器,可以通过类的公有静态工厂,它是一个返回类的实例的静态方法。
如:
public static Boolean valueof(boolean b){
return b ? Boolean.TRUE : Boolean.FALST;
}
静态工厂方法优势:
不必在每次调用他们的时候都创建一个新对象。
他们可以返回原返回类型的任何子类型的对象。
所返回的对象可随每次调用参数的不同而不同。
方法返回对象所属的类,在编写时可以不存在。
静态工厂方法缺点:
类如果不含公有或者受保护的构造器,就不能被子类化
很难发现他们。
总结:
静态方法更加适合,切记第一反应时提供公有的构造器,而不考虑静态工厂
2 当遇到多个构造器参数时考虑用构建器(建造者)替换
注意:这里是构建器。
静态工厂和构造器有个共同的属性:他们都不能很好地扩展到大量的可选参数。重叠构造器较为麻烦,javaBeans模式又会在构造过程中处于不一致问题。
最好的替代方法是建造者(Builder)模式中的一中形式。Builder模式也适合类层次结构
总结:如果类的构造器或者静态方法中具有多个参数,设计这种类时,Builder模式是个不错的选择。
3 用私有构造器或者枚举类型强化单例属性
单例(Singleton)客户端测试十分困难。
实现单例的方式有三种:
1、构造器私有,导出公有的静态成员
2、静态工厂方式:优势是灵活。
3、声明一个包含单个元素的枚举类型
此方法为最佳,无偿提供序列化机制,绝对防止多次实例化。
public enum Elvis{
INSTANCE;
public void leaveThebuilding(){....}
}
4 通过私有构造器强化不可实例化的能力
这部分未看懂
5 依赖注入优先硬连接资源
静态工具类和Singleton类不适合于需要引用底层资源的类。
因此满足该需求的最简单模式,就是创建实例时。就将该资源传到构造器中。(这就是依赖注入)
6 避免创建不必要的对象
1、如上面说,通常优先使用静态工厂方法而不是构造器,以避免创建不必要的对象。
如:
String s = new String("AMbi");
String s = "Ambi";//更好
2、另一种创建多余对象的是,自动装箱
结论:要优先使用基本类型而不是装箱类型
3、维护自己的对象池来避免创建对象并不是一个好的做法,除非是重量级(数据库连接)
7 消除过期的对象引用
对象引用。。嘻嘻嘻。自行百度
8 避免使用终结方法和清理器
终结方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的,因为从一个对象到它的终结方法执行(类似于c++的析构函数
),所花费的时间是不可预测的。在java9中可以使用清除方法(cleaner)代替了终结方法。虽然清除方法没有终结方法那么危险,但仍然是不可预测、运行缓慢,一般情况下也是不必要的。
不使用的结论:
1、永远不应该依赖终结方法或者清除方法更新重要的持久状态。
2、使用终结方法和清除方法有一个非常严重的性能损失。
3、终结方法有一个严重的安全问题:从构造器抛出的异常,应该足以防止对象继续存在;有了终结方法的存在,这一点就无法做到的了。
不使用终结方法、清除方法即可做到资源的终止。
答:让类实现AutoCloserable,一般利用try-with-resources确保终止。
合法用途:
1、当资源的所有者忘记调用他的close方法,终结方法或者清除方法可以充当“安全网”。
2、与对象的本地对等体
有关,本地对等体就是一个本地(非java的)对象,普通对象通过本地方法委托给一个本地对象。
9 try-with-resources优先try-finally
结论:
在处理不许关闭的资源时,始终要有限考虑用try-with-resources,而不是try-finally。这样得到的代码整洁,产生的异常有价值。