2016-10-23 216 views
4

按照书“Effecive的Java”这句话是什么“类的静态工厂方法返回的对象甚至不必在包含方法的类写入时存在 “。意味着在以下段落中:服务提供商框架

在写入包含该方法的类时,静态工厂方法返回的对象的类不需要存在 。这种灵活的静态工厂方法构成了服务提供者框架的基础,例如Java Database Database Connectivity(JDBC)。服务提供者框架是其中多个服务提供者实现服务的系统,并且系统使得其实现 对其客户可用,将它们从实现中解耦合

回答

1

工厂方法通常将返回一个类,实现一个接口(或者扩展一个类,同样的结果)。但是要返回的实际类可以动态定义。在这种情况下,写入工厂方法时不需要存在要返回的类。

可能是最简单的例子。 JDBC示例与DriverManager类似 - 您提供了一个数据库连接URL。 DriverManager需要从该URL中找出要返回的类。如果您使用的是Oracle数据库,它将创建一个Oracle驱动程序类(它实现JDBC API),即使DriverManager不具体了解Oracle的任何信息。

作为一般情况,假设我们的工厂方法返回接口AA。工厂方法的实现可能会读取一个定义要创建的类的配置文件,然后使用反射在运行时创建该类。定义的类只需存在于CLASSPATH中。工厂方法知道如何创建它,但是在写入工厂方法时实现并不存在。

有很多日常的例子会出现这种情况:JDBC提供程序,自定义日志appender,XML提供程序。

6

按照书“Effecive的Java”这句话是什么“之类的 通过静态工厂方法返回的对象甚至不必在 存在包含该方法的类写入的时间。”意味着 以下段落:

一个好办法解释什么是这句话的意思是考虑EnumSet型,这是在java.util包中的类。

EnumSet是一个抽象类,没有任何可访问的构造函数。为了得到一个EnumSet实例,程序员使用它的一个静态工厂方法,例如。 EnumSet.of(...)。例如:

Set<MyEnum> s = EnumSet.of(MyEnum.FIRST_CONSTANT); 

of()方法返回的对象不具有EnumSet实现类型。相反,实施类型取决于MyEnum类。如果MyEnum具有64个或更少的常量,则由of()返回的对象的类型是RegularEnumSet。如果MyClass的常量超过64个,则返回的对象的类型为JumboEnumSet。然而,返回的对象的实际类型对程序员来说不感兴趣。他或她所关心的是获得某种类型的符合EnumSet合同的对象。

现在,让我们假设,五年后,Java语言架构师决定让另一个EnumSet实现类型变得非常重要,例如,对于具有大量常量的类的缓存枚举实现(超过1024)。他们写这类跟随EnumSet合同,并称之为:

final CachedEnumSet extends EnumSet { 
    : 
    : 
} 

即使CachedEnumSetEnumSet被写入不存在,即使用静态工厂启用了一个基于契约的实现系统的事实启用了Java建筑师在数年后添加新的实施。

现在,当一个客户端调用EnumSet.of(),他或她可以得到一个RegularEnumSet对象,JumboEnumSet对象,或新的CachedEnumSet对象,但他们不会在意,因为他们得到的对象仍是EnumSet一个亚型,是受其合约约束。