1. 创建和销毁对象

1.1. 使用静态工厂方法来替代构造器 (To Be Continued) 1

小技巧

对于一个类,如果同时存在构造函数和静态工厂方法这两种方法可以获取预期类对象,那么 静态工厂方法优先级 > 构造函数优先级

1.1.1. 优点

静态工厂方法的一个优点是,不像构造方法,它们是有名字的。 如果构造方法的参数本身并不描述被返回的对象,则具有精心选择名称的静态工厂更易于使用,并且生成的客户端代码更易于阅读。 例如,返回一个可能为素数的 BigInteger 的构造方法 BigInteger(int,int,Random) 可以更好地表示为名为 BigInteger.probablePrime 的静态工厂方法。

静态工厂方法的第二个优点是,与构造方法不同,它们不需要每次调用时都创建一个新对象。 这允许不可变的类 (rule 17) 使用预先构建的实例,或者在构造时缓存实例,并反复分配它们以避免创建不必要的重复对象。

静态工厂方法的第三个优点是,与构造方法不同,它们可以返回其返回类型的任何子类型的对象。 这为你在选择返回对象的类时提供了很大的灵活性。

静态工厂的第四个优点是返回对象的类可以根据输入参数的不同而不同。 声明的返回类型的任何子类都是允许的。 返回对象的类也可以随每次发布(接口实现版本)而不同。

EnumSet 类(条目 36)没有公共构造方法,只有静态工厂。 在 OpenJDK 实现中,它们根据底层枚举类型的大小返回两个子类中的一个的实例:如果大多数枚举类型具有 64 个或更少的元素,静态工厂将返回一个 RegularEnumSet 实例, 返回一个 long 类型;如果枚举类型具有六十五个或更多元素,则工厂将返回一个 JumboEnumSet 实例,返回一个 long 类型的数组。

静态工厂的第 5 个优点是,在编写包含该方法的类时,返回的对象的类不需要存在。 这种灵活的静态工厂方法构成了服务提供者框架的基础,比如 Java 数据库连接 API(JDBC)。服务提供者框架是提供者实现服务的系统,并且系统使得实现对客户端可用,从而将客户端从实现中分离出来。

1.2. 遇到多个构造器参数时要考虑使用构建器(Builder模式)

静态工厂和构造方法都有一个限制:它们不能很好地扩展到很多可选参数的情景。


1

更新日期: 2021年8月22日