【发布时间】:2019-04-13 21:40:00
【问题描述】:
在阅读“Effective Java”时,J.Bloch 偶然发现了这句话
静态工厂的第五个优点是在编写包含该方法的类时,返回对象的类不需要存在。
这是什么意思?有人可以用一些例子来解释吗?
【问题讨论】:
标签: java
在阅读“Effective Java”时,J.Bloch 偶然发现了这句话
静态工厂的第五个优点是在编写包含该方法的类时,返回对象的类不需要存在。
这是什么意思?有人可以用一些例子来解释吗?
【问题讨论】:
标签: java
这意味着你的静态工厂方法的API可以返回一个接口类型,它的实现要等到以后再编写或生成。
举个例子:
public static MyInterface getMyInterfaceInstance() {
//load instance dynamically and return it.
}
在这种情况下,工厂方法只需要在编译时存在MyInterface 接口即可。实际实现可以在运行时以多种方式动态加载,包括:
特别是,最后两个选项仅仅意味着实现类可以写在不同的模块中(并且许多模块可以提供接口的实现),并且这些实现类将在运行时被发现 - 这使得它成为可能在实际实现类之前编写静态工厂方法。
【讨论】:
MyInterface 没有实现,它会导致错误,除非返回null。我真的无法理解它。
getMyInterfaceInstance() 的代码可以在实现MyInterface 的代码之前几周发布。如果这个方法的实现是,例如return (MyInterface) Class.forName(System.getProperty("my.interface.implementation.class")).newInstance(),那么实现MyInterface的类不需要和这个静态工厂同时编译。当然需要一个实现类(但仅在运行时)