0

我的应用程序使用 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 中以相同的方式加载。有没有办法区分它们?

4

0 回答 0