《Effective Java 第三版》笔记之一 创建静态工厂方法而不是使用构造器
《Effective Java》是一本非常优秀的关于Java编程思想的书籍,第二版出版于2009年,已经过时了。第三版也在2018年推出了,本系列博客讲述第三版中的各项内容。
一般情况下,Java类提供实例化的方法是提供一个可以被公共访问的构造方法。但是每个编程的人员都应当了解另一种提供实例化的方式,即静态工厂方法,也就是提供一个静态方法,可以返回类的一个实例。例如,下面是一个简单的提供Boolean类实例化方法:
public static Boolean valueOf(boolean b){
return b? Boolean.TRUE: Boolean.FALSE;
}
注意,静态工厂方法(a static factory method)与设计模式中的工厂方法(Factory Method)模式不是同一个概念。这里描述的静态工厂方法与设计模式一点关系都没有。
一个类除了提供公共的构造方法外,还可以使用静态工厂方法提供其实例。而使用静态工厂方法提供实例既有优点也有缺点。
**优点一:**与构造方法不同的是静态工厂方法有自己的方法名。如果一个构造方法的参数本身并不能描述其返回的对象(意思就是说通过参数类型无法表达出这个构造方法想要干什么——笔者注),那么使用静态工厂方法,取一个好的名字就是一种好的选择了,它会使代码更加容易阅读。例如构造方法 BigInteger(int, int, Random) 返回一个很大的近似素数(大素数在加密和解密算法中有很重要的作用,求两个很大的素数乘积很简单,而找出一个数是被哪两个大的素数相乘则是一个非常困难的事情。但是判断一个很大的值是不是素数并不是容易的事情,这个方法就是返回一个数,它在多大概率上是一个素数,这里可以称之为概素数——笔者注),这并不容易让人理解,改成BigInteger.probablePrime则相对来说易于理解许多(这个方法在Java4中已经添加了)。
这里我们用另一个例子描述可能会清晰一点。假设有一个产生随机数的类,它可以帮助我们产生介于某个最小值和某个最大值之间的随机数(使用next()方法产生):
