第1条:考虑用静态方法而不是构造器

一个客户端若想获得某个类的一个实例,一种传统的方式就是让该类提供一个公有的构造器。但是,每个程序员的工具箱里头也应当还有另一种技术:该类也可以提供一个公有的静态工厂方法,然后通过这个静态方法来返回该类的一个实例。这里举一个Boolean类(基本类型boolean的封装类)的例子。这个方法将一个boolean基本类型值转换成一个Boolean对象引用:

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

要注意的是,静态工厂方法不同于设计模式[工厂方法模式

静态工厂方法的优势是:

它们有名字,

静态工厂方法不必在每次被调用时都产生一个新的对象,

静态工厂方法能返回原返回类型的任意子类型的对象,

可以根据调用时传入的不同参数而返回不同类的对象,

在编写包含该方法的类时,返回对象的类不需要存在

只提供静态工厂方法的主要限制在于,没有公有或者保护构造方法的类不能子类化。例如,Java的集合框架里面的任一便利实现都无法被子类化。但另一方面,这也鼓励了程序员使用组合而不是继承,而且这也是不可变类型所需要的。从这两个角度看,也算是因祸得福了。

静态工厂方法的第二个不足之处是程序员难以找到他们。它们并不像构造器那样能在API文档中明显标示出来,因而会有点难以知道如何初始化一个只提供静态工厂方法而不是构造器的类。也许Javadoc文档工具在未来某一天会注意到这个问题。为了减少这个问题的出现,我们可以多关注类文档或接口文档里的静态工厂,同时遵守通用的命名规则。 

猜你喜欢

转载自www.cnblogs.com/lIllIll/p/12154582.html