gpt4 book ai didi

java - 实现没有拆分包的(编译时)插件架构

转载 作者:太空宇宙 更新时间:2023-11-04 11:12:40 24 4
gpt4 key购买 nike

past question中我问如何设计一个系统:

  • 类包含一个或多个可选方法。
  • 可选方法由编译时可能存在或不存在的插件实现。
  • 如果用户调用的方法在编译时不存在关联插件,则会出现编译时错误。

我提供了one possible solution适用于 Java 8。

不幸的是,该解决方案依赖于 Java 9 模块系统不允许的拆分包(两个模块导出同一包)的使用。

如何在 Java 9 中实现这一点?

最佳答案

Services

如果我正确理解了这个问题,您期待使用的是模块系统中的服务。

Java has long supported services via the java.util.ServiceLoader class, which locates service providers at run time by searching the classpath.

模块系统可以通过扫描模块工件中的类文件来调用 ServiceLoader::load 方法来识别服务的使用。

根据您当前的项目结构,您应该定义一个抽象类或一个接口(interface),它们可以在guavacore模块类中扩展或实现,并由它们提供。

<小时/>

模块使用特定服务是该模块定义的一个重要方面,因此为了效率和清晰性,它在模块声明中使用 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;
}

关于java - 实现没有拆分包的(编译时)插件架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45823641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com