《Effective Java》: 考虑用静态工厂方法代替构造函数

考虑用静态工厂方法代替构造函数

类可以为它的客户提供一些静态工厂方法,来替代构造函数,或者同时也提供一些构造函数。

 

 静态工厂方法的一个好处是,与构造函数相比,静态工厂方法具有名字,它可以使得代码更容易阅读。如果一个类看起来需要多个构造函数,并且它们的原型特征相同,那么你应该考虑用静态工厂方法来代替其中一个或多个构造函数,并且慎重选择它们的名字以便明显地标示出它们的不同。

静态工厂方法的第二个好处是,与构造函数不同,它们每次被调用的时候,不要求非得创建一个新的对象。静态工厂方法可以为重复的调用返回同一个对象。这样做有两个理由。第一,它使得一个类可以保证是一个singleton。第二,它使得非可变类可以保证“不会有两个相等的实例存在”。

静态工厂方法的第三个好处是,与构造函数不同,它们可以返回一个原返回类型的子类型的对象。这种灵活性的一个应用是,一个API可以返回一个对象,同时又不使该对象的类成为公有的(匿名类或私有类)。以这种方式把具体的实现类隐藏起来,可以得到一个非常简洁的API。这项技术非常适合基于接口的框架结构,因为在这样的框架结构中,接口成为静态工厂方法的自然返回类型。

 

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

静态工厂方法的第二个缺点是,它们与其他的静态方法没有任何区别,在API文档中,他们不会像构造函数那样被明确标示出来。如果遵循标准的命名习惯,就可以将这个缺点减小到最少。这些命名习惯仍在演化中,但是静态工厂方法的两个名字已经变的很流行了:

★ valueOf    不太严格的讲,该方法返回的实例与它的参数具有相同的值。

★ getInstance    对于singleton的情形,这个方法返回惟一的实例。

 

总的来说,静态工厂方法和公有的构造函数都有它们各自的用途,我们需要理解它们各自的长处。要避免一上来就提供构造函数,而不考虑静态工厂,因为静态工厂通常更适合。如果你正在权衡这两种选择,又没有其他因素强烈的影响你的选择,那么你最好还是简单地使用构造函数,毕竟它是语言提供的规范。

你可能感兴趣的:(学习笔记)