ARTS - Share 补2019.3.6

本章的主题是创建和销毁对象:什么时候、如何创建对象;什么时候、如何避免创建对象;如何保证对象能够适时的销毁;对象被销毁之前如何管理各种清理工作。

第1条:考虑用静态工厂方法代替构造函数

一个类,为了让客户获得它的一个实例,最通常的做法是提供一个公有构造函数。或者提供一个公有的 静态工厂方法(static factory method),就是一个简单的静态方法,返回类的一个实例。如boolan的 包装类 Boolean, valueOf方法:

public static Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
    }

类可以为它的客户提供一些静态工厂方法,来代替构造函数,或者同时提供一些构造函数。一个好处是静态工厂方法具有名字,使得类更易用,客户代码更易读。静态工厂方法有自己的名字,没有构造函数只能有一个原型相同的构造函数,可以有不止一个静态工厂方法。如果一个类看起来需要多个构造函数,并且原型特征相同,那么应该考虑用静态工厂方法来代替其中一个或多个构造函数,并且慎重选择他们的名字以便明显表示它们的不同。

静态工厂方法第二个好处是,与构造函数不同,每次调用时候不要求非得创建一个新对象。是的一些非可变类可以使用一个预先构造好的实例,或者把已经构造好的实例缓存起来,在把实例分发给客户,避免创建不必要的重复对象。

静态工厂方法可以重复调用返回同一个对象,1. 使得一个类可以保证是一个singleton, 2、使非可变类可以保证不会有两个相等的实例存在,即当且仅当 a == b 时才有 a.equals(b) 为true. 如果一个类保证了这一点,客户可以用== 来代替 equals ,性能提升。String.intern 是一种有限的方式实现了这种优化。

静态工厂方法第三个好处是,与构造函数不同,可以返回一个原返回类型的子类型的对象,这样我们选择返回对象类型时候就有了更大的灵活性。

应用就是一个API可以返回一个对象,同时又不使改对象的类成为公有的。以这种方式把具体的实现类隐藏起来,可以得到一个非常简洁的API。

静态工厂方法的主要缺点是,类如果不含公有的或者受保护的构造函数,就不能被子类化。

第二个缺点是,它们与其他的静态方法没有任何区别。

总的来说,静态工厂方法和公有的构造函数都有他们各自的用途,我们需要理解它们各自的长处。