注:这里只做总结。代码和实例请看书。

创建和销毁对象

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。这样得到的代码整洁,产生的异常有价值。


一个好奇的人