通常一个类允许使用者获取其实例的传统方式是提供一个公共构造方法,还有另外一种方法我们也应该掌握。一个类还可以提供一个公共的静态工厂方法,该方法返回一个类的实例。下面是一个常见的例子,此方法将boolean基本类型转换为Boolean对象的引用:
Boolean booleanTrue = Boolean.valueOf(true);
Boolean.class
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
public static Boolean valueOf(boolean var0) {
return var0 ? TRUE : FALSE;
}
使用这种方式有以下优点:
-
静态工厂方法是有名字的,返回不同的对象可以命名不同的方法名,不像构造方法都是同样的构造方法名。有精心选择的静态工厂方法名更易于使用,并且生成的代码更易阅读。
-
静态工厂方法与构造方法不同,它们不需要每次调用时都生成一个新的对象。
-
静态工厂方法与构造方法不同,它们可以返回其返回对象类型的任何子类型的对象,这为你在选择对象的类时提供很大的灵活性。EnumSet 类(条目 36)没有公共构造方法,只有静态工厂方法。 在 OpenJDK 实现中,它们根据底层枚举类型的大 小返回两个子类中的一个的实例:如果大多数枚举类型具有 64 个或更少的元素,静态工厂将返回一个RegularEnumSet实例, 返回一个 long 类型;如果枚举类型具有六十五个或更多元素,则工厂将返回一个 JumboEnumSet实例,返回一个 long 类型的数组。
public static <E extends Enum> EnumSet noneOf(Class var0) { Enum[] var1 = getUniverse(var0); if (var1 == null) { throw new ClassCastException(var0 + " not an enum"); } else { return (EnumSet)(var1.length <= 64 ? new RegularEnumSet(var0, var1) : new JumboEnumSet(var0, var1)); } }
下面是一些静态工厂方法的常用名称:
-
from——A 类型转换方法,它接受单个参数并返回此类型的相应实例,例如:Date d = Date.from(instant);
-
of——一个聚合方法,接受多个参数并返回该类型的实例,并把他们合并在一起,例如: Set faceCards = EnumSet.of(JACK, QUEEN, KING);
-
valueOf——from 和 to 更为详细的替代方式,例如:BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);
-
instance 或 getInstance——返回一个由其参数 (如果有的话) 描述的实例,但不能说它具有相同的值,例如: StackWalker luke = StackWalker.getInstance(options);
-
create 或 newInstance——与 instance 或 getInstance 类似,该方法保证每个调用返回一个新的实例,例如: Object newArray = Array.newInstance(classObject, arrayLen);
-
getType——与 getInstance 类似,Type 是工厂方法返回的对象类型,例 如:FileStore fs = Files.getFileStore(path);
-
newType——与 newInstance 类似,Type 是工厂方法返回的对象类型, 例如:BueredReader br = Files.newBueredReader(path);
-
type—— getType 和 newType 简洁的替代方式,例如:List litany = Collections.list(legacyLitany);
摘自《Effective.Java》
欢迎关注公众号:玉祥笔记