gpt4 book ai didi

java - Java SPI-选择单个实现

转载 作者:行者123 更新时间:2023-12-01 06:01:14 25 4
gpt4 key购买 nike

当我们要查找接口或抽象类的所有可用实现并针对每个实现执行操作时,Java SPI易于使用:

ServiceLoader.load(SomeService.class)
.forEach(service -> service.doSomething());


从多个可用实现中选择单个实现的习惯用法是什么?我能想到的许多服务对于多个实例都没有意义。

我们可以使用 iterator().next()来找到从ServiceLoader返回的第一个实现,但这并不能为用户提供一种选择他们想要使用的特定实现的方法。据我所知,迭代顺序在某种程度上是随机的,并且基于META-INF / services文件的类路径顺序而不一致。

当然,我会丢失一些东西,而不必编写我们自己的“如果设置了系统属性,则加载此类,否则从ServiceLoader加载iterator.next”即可解决此问题。

最佳答案

从多个中选择一个实现的成语是什么
  可用的实现?


同时具有多个实现是很有意义的。

举个例子:

interface ImageFilter {
String getName();
String getDescription();
String getUsage();
List<Parameter> getParameters();
Image apply(Image image, List<Parameters> parameters);
}


现在,您的程序(服务,库等)可以使用任何类型的图像过滤器,即使在程序之后安装了它也是如此。


  据我所知,迭代顺序


您只需要迭代就可以知道可用的实现,但是不必立即使用它们。在图像过滤器示例中,您将迭代将其显示在选择器中(例如,使用 getName),而用户将选择一个应用( apply),查看详细信息( getDescription),用法,参数, ...

但这只是示例,还有许多其他可能的方案(例如,对于计算,您可以并行启动所有实现,并查看哪个实现之前结束,或者采用达到最佳准确性的实现,...或者您可以根据某些代码注释来选择实现...)。

另一方面,写 META-INF/services只是注入可用实现的一种方法,有关详细信息,请参见 Creating Extensible Applications

关于java - Java SPI-选择单个实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58140651/

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