微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

服务标识

如何解决服务标识

服务接口:

public interface UserInterface {

    void present();

    void onStart();

    void onStop();

}

我有两个实现:TextUserInterfaceGraphicalUserInterface。 当我启动我的程序时,如何确定我想使用的那个?来源

private static void main(String[] args) {
    ServiceLoader<UserInterface> uiLoader = ServiceLoader.load(UserInterface.class);
    UserInterface ui = uiLoader.?   //what to do to identify the one I want to use?
}

我想引入一个具有 UI 类型的 enum,这样我就可以遍历所有服务并选择我想要的服务,但是这种方法是否只是一种误用服务在这种情况下,当我想选择 GraphicalUserInterface 时,我可以跳过 ServiceLoader 部分并实例化一个。我看到的唯一区别是,如果没有服务,我必须require GraphicalUserInterface 模块,这“有点”破坏了封装。

解决方法

我实际上并不认为这是对它的滥用。事实上,你从 ServiceLoader.load(...) 方法得到的是一个 Iteratable 对象,如果你需要一个特定的服务,你将不得不遍历所有可用的实例。
枚举的想法并没有那么糟糕,但我建议您利用 Java 流并过滤您需要的实例。例如,您可能有这样的情况:

enum UserInterfaceType {
    TEXT_UI,GRAPH_UI;
}

public interface UserInterface {
     UserInterfaceType getTypeUI();
     
     ...
}

// In your main method
ServiceLoader<UserInterface> uiLoader = ServiceLoader.load(UserInterface.class);
UserInterface ui = uiLoader.steam()
                           .filter(p -> p->getTypeUI() == <TypeUIyouNeed> )
                           .findFirst()
                           .get();

这对多种可能性是开放的,例如你可以把这是一个分离的方法,它在输入中接收一个 UserInterfaceType 值,它可以根据你传递的类型枚举值检索服务实现.

正如我所说,这只是主要思想,但您绝对没有滥用 ServiceLoader

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?