mirror of
https://github.com/sjsdfg/effective-java-3rd-chinese.git
synced 2025-01-19 08:40:11 +08:00
Update 01. 考虑使用静态工厂方法替代构造方法.md
This commit is contained in:
parent
0cfa1275ef
commit
c1cbb7f072
@ -46,7 +46,7 @@ public static Boolean valueOf(boolean b) {
|
||||
|
||||
服务提供者框架的一个可选的第四个组件是一个服务提供者接口,它描述了一个生成服务接口实例的工厂对象。在没有服务提供者接口的情况下,必须对实现进行反射实例化(详见第 65 条)。在 JDBC 的情况下,`Connection` 扮演服务接口的一部分,`DriverManager.registerDriver` 提供程序注册 API、`DriverManager.getConnection` 是服务访问 API,`Driver` 是服务提供者接口。
|
||||
|
||||
服务提供者框架模式有许多变种。 例如,服务访问 API 可以向客户端返回比提供者提供的更丰富的服务接口。 这是桥接模式[Gamma95]。 依赖注入框架(详见第 5 条)可以被看作是强大的服务提供者。 从 Java 6 开始,平台包含一个通用的服务提供者框架 `java.util.ServiceLoader`,所以你不需要,一般也不应该自己编写(条目 59)。 JDBC 不使用 `ServiceLoader`,因为前者早于后者。
|
||||
服务提供者框架模式有许多变种。 例如,服务访问 API 可以向客户端返回比提供者提供的更丰富的服务接口。 这是桥接模式[Gamma95]。 依赖注入框架(详见第 5 条)可以被看作是强大的服务提供者。 从 Java 6 开始,平台包含一个通用的服务提供者框架 `java.util.ServiceLoader`,所以你不需要,一般也不应该自己编写(详见第 59 条)。 JDBC 不使用 `ServiceLoader`,因为前者早于后者。
|
||||
|
||||
**只提供静态工厂方法的主要限制是,没有公共或受保护构造方法的类不能被子类化。** 例如,要想将 `Collections` 框架中任何遍历的实现类进行子类化,是不可能的。但是这样也会因祸得福,因为它鼓励程序员使用组合(composition)而不是继承(详见第 18 条),并且是不可变类型锁需要的(详见第 17 条)。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user