在past question中,我问如何设计一个系统:
我提供了适用于Java 8的one possible solution。
不幸的是,此解决方案取决于Java 9模块系统不允许使用拆分包(导出相同包的两个模块)。
如何在Java 9中实现?
答案 0 :(得分:0)
如果我已正确理解了您正在使用的问题,那么您需要使用的是模块系统中的服务。
Java长期以来通过
java.util.ServiceLoader
支持服务 class,通过搜索来在运行时定位服务提供者 类路径。
模块系统可以通过扫描模块工件中的类文件来识别ServiceLoader::load
方法的调用来识别服务的使用。
使用您当前的项目结构,您应该定义abstract class
或interface
,它可以是在guava
,core
模块类中实现的扩展,并提供由他们。
模块使用特定服务是该模块定义的一个重要方面,因此为了效率和清晰度,它在模块的声明中用 uses
子句表示:
module com.foo.bar.sql {
uses com.foo.Verifiers;
}
模块提供特定服务的实现同样重要,但是,这是通过 provides
子句放在模块的声明中:
module guava {
provides com.foo.Verifiers with com.guava. GuavaVerifier;
}
module core {
provides com.foo.CoreVerifier with com.guava. GuavaVerifier;
}