考虑使用静态工厂方法代替构造器

在Java中有许多有用的“静态”类,之所以加上引号,是因为该类并未声明成static的(实际上对于外部类而言,只能接受public abstract 和 final这三个关键字)。但是对于程序员来说,该类是静态的,因为该类的内部显示定义了一个private的无参构造器(这样编译器不会自动添加默认的公有无参构造器),所以该类无法在外部进行实例化,事实上也没有必要使用new关键字进行实例化。因为这些类的内部并不存在可以改变状态的字段(即使有也是final的),在类的内部存在大量的被称作静态工厂(static factory)的方法。在JDK中有几个比较常见的例子,比如Collections,Arrays和Executors。这些类的内部提供了许多静态工厂方法(不同于设计模式中的工厂模式),用来返回一些类的实例。

使用静态工厂方法有几个优势(相对于构造器)

1. 该静态工厂方法有名称,通过赋予有意义的名称,使用该方法的程序员可以清晰的知道该方法的含义。而不同的构造器具有相同的名称,很难表示各自的不同含义,特别是当构造器的参数类型相同(可能顺序不同),这样程序员很容易出错。

2. 静态工厂方法不必每次调用都会创建一个新对象,比如你可以在静态工厂方法里限定创建该对象的个数,当超出规定的个数时,返回缓存里的对象。而每次调用构造器都会创建一个新的对象。

3. 静态工厂方法可以返回原返回类型的任何子类型的对象。使用接口来引用对象可以使程序有较大的灵活性。

4. 静态工厂方法在创建参数化类型的时候,可以使代码更加简洁。考虑实例化一个Map对象,该map的变量类型和实例化时都必须指明参数类型,很是繁琐:

Map> m = new HashMap>();

当使用静态工厂方法时,

public static HashMap newInstance() {

return new HashMap();

}

Map> m = HashMap.newInstance();

你可能感兴趣的:(Java)