在Java中对于类来说,要实例化一个对象,最简单的方式就是通过new构造器来实现。而除了new构造器还有一种很常见的方法,就是静态工厂方法。
请先看这段代码:
public static String valueOf(int i) {
return Integer.toString(i);
}
在Java的包装类中存在大量的valueOf静态方法,这些方法就是静态工厂方法。通过静态工厂方法可以直接返回这个类的对象。注意,静态工厂方法与设计模式中的工厂方法模式是不同的,不要搞混淆了。
那么,已经有了new构造器的方式来创建对象了,为什么还要采用静态工厂方法呢?
因为静态工厂方法具有这些优势:
1、静态工厂方法是有名称的,更易于阅读。例如,构造器People(String name, int age, boolean isMale) 返回一个People可能是男性,根据isMale来区分,如果用名称People.createMale(String name, int age)的静态工厂方法来表示,就可以很清楚的知道返回的是男性。
2、静态工厂方法可以返回类型的任何子类型对象。这是一个灵活的使用方式,在vert.x框架中,就大量的采用了这种方式。例如BodyHandler.create返回的是BodyHandlerImpl的对象,Router.router返回的是RouterImpl对象。
3、静态工厂方法可以在创建参数化类型实例的时候,使代码更简洁。
请看下面这段代码:
public class MyMap<K, V> {
K key;
V value;
}
一般会这样去构造一个MyMap对象:
MyMap<String, List<String>> map = new MyMap<String, List<String>>();
那么,在稍微的修改一下MyMap类的代码,加一个静态工厂方法:
public static <k,V> MyMap<k, V> newInstance() {
return new MyMap<k ,V>();
}
你就可以用下面这种更简洁的方法去创建对象了:
MyMap<String, List<String>> map = MyMap.newInstance();
自jdk 1.8后,第3个优点已经不明显了,因为jdk可以自动推导参数化类型了。在不增加静态工厂方法的情况下还可以这样写:
MyMap<String, List<String>> map = new MyMap<>();