所以,这就是我的结构
interface FactoryService {
Foo createFoo(int a, String b);
}
@AutoService(FactoryService.class)
class SomeFactory implements FactoryService {
public Foo createFoo(int a, String b) {
// How to implement service loader here, which loads Foo
}
}
interface Foo {
void opsForFoo(InputStream s, OutputStream o)
}
class FooImpl implements Foo {
// Constructor
public FooImpl(int a, String b) {}
public void opsForFoo(InputStream s, OutputStream o) {
// perform operation here
}
}
如何在SomeFactory
类中实现ServiceLoader?我遇到的问题是FooImpl
从构造函数中获取了两个值。我可以做new FooImpl(a, b)
,但是对吗?展望未来,可能会有其他实现Foo
答案 0 :(得分:0)
serviceloader基础结构的要点是,您可以定义任何数量的类,这些类是为您为其创建serviceloader的对象的实现,并且它们可以在类路径中的任何位置。
例如,在您的示例中,您将要加载'FactoryService'(而不是foo!),因此,您的代码可以提供任意数量的FactoryService实现,并且进行服务加载将为每个实例获取1个实例。以及您设置的每个此类FactoryService类。在这里,您将建立一个名为“ SomeFactory”的类。
此特定的FactoryService变体(您的'SomeFactory')将在调用后(调用其createFoo
方法时)返回FooImpl的实例。
如果某天有不同的Foo暗示,则有两种选择:
[1]扩展SomeFactory类,以根据您想要的内容返回此不同的impl(毕竟,这是代码的极限)。例如:return a < 0 ? new NegativeFooImpl(Math.abs(a), b) : new PositiveFooImpl(a, b);
[2]再创建一个也实现FactoryService的类。
这里FactoryService
的总体布局有点奇怪:假设有10个工厂服务,这里的想法是什么?出现了一些请求,不管是在为factoryservice进行服务加载时,调用所有10个服务,产生10个foo,然后..选择一个?大概FactoryService
接口需要一些Javadoc,例如:/** If a and b are such that this call is not for you, return null. The code that loads foos will go with the Foo value returned by the first implementation of FactoryService called that returns non-null. */
例如,最后一个看起来像:
public class FooMaker {
ServiceLoader<FactoryService> fooFactories = ServiceLoader.load(FactoryService.class);
public Foo createAFoo(int a, String b) {
for (FactoryService factory : fooFactories) {
Foo foo = factory.createFoo(a, b);
if (foo != null) return foo;
}
return null;
}
}