我的应用程序使用 ServiceLoader,我有两种类型的服务:算法和导出器。编码 :
public abstract class Algorithm<E> {
public abstract E process();
public abstract void askParameters();
}
public abstract class Exporter<E> {
public abstract void export(E element);
public abstract void askParameters();
}
我有另一个类,Executor,它将算法和导出器“连接”在一起:
public class Executor<T, A extends Algorithm<T>, E extends Exporter<T>> {
A algo;
E exporter;
public Executor(A a, E e){
algo = a;
exporter = e;
}
public void execute(){
algo.askParameters();
exporter.askParameters();
exporter.export(algo.process());
}
}
团队成员为多种类型的事物独立编码算法和导出器。他们把它放在一个罐子里,注册算法或导出器的服务提供者,应用程序的核心在于组合这些模块。
我写了那个小测试:
public class MainTestServiceLoader {
public static void main(String[] args) {
AlgorithmService algoService = new AlgorithmService();
ExporterService exporterService = new ExporterService();
Algorithm<Labyrinth> braidMaze = algoService.getAlgorithm1();
Exporter<Labyrinth> toLvl = exporterService.getExporter1();
Executor<Labyrinth,Algorithm<Labyrinth>,Exporter<Labyrinth>> executor = new Executor(braidMaze,toLvl);
executor.execute();
}
}
但我预见到了未来的问题。由于加载器不知道算法或导出器的具体类型,我如何确定两者的组合是兼容的?或者有没有办法根据算法/导出的工作类型来过滤服务加载器中的服务?谢谢
编辑:为了更清楚:假设有人编写了一个模块算法,另一个编写了一个导出器。它们将在 ServiceLoader 中以相同的方式加载。有没有办法区分它们?