如何解决服务标识
服务接口:
public interface UserInterface {
void present();
void onStart();
void onStop();
}
我有两个实现:TextUserInterface
和 GraphicalUserInterface
。
当我启动我的程序时,如何确定我想使用的那个?来源
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 举报,一经查实,本站将立刻删除。