我有一个问题,我不知道该怎么解决
说我有两个服务提供商接口(SPI)
public interface View{
display();
}
public interface Logger{
log(String s);
}
以及同时提供这两种服务的服务提供商
public class LogView implements View, Logger{
...
}
问题是,当我尝试通过ServiceLoader.load(Logger.class)
获取日志服务的实例时,它与使用ServiceLoader.load(View.class)
创建的实例不同。有没有办法解决这个问题,以便我可以从两个调用中获得相同的对象实例?
这个想法是,在将视图作为GUI加载后,我希望能够登录到该GUI的同一实例,而不是另一个。现在,我被两个单独的实例卡住了,因此日志确实显示了。
答案 0 :(得分:2)
已将解决方案与Java模块一起添加,但需要注意的是,它仅可与显式模块一起使用,即与模块信息中的服务声明一起使用,而不是与{{1中的文件}}。
然后,您可以声明要使用的&&
方法代替公共默认构造函数,而返回类型META-INF/services
必须可分配给服务类型。声明了这样的方法后,声明类型不必是public static T provider()
本身的实现,但是它不是错误。
因此给出了类声明
T
T
package somemodule;
public interface Logger{
void log(String s);
}
和类似的模块声明
package somemodule;
public interface View{
void display();
}
以下代码显示package somemodule;
public class LogView implements View, Logger {
static final LogView INSTANCE = new LogView();
private LogView() {}
public static LogView provider() {
return INSTANCE;
}
@Override
public void display() {
System.out.println("display");
}
@Override
public void log(String s) {
System.out.println("log "+s);
}
}
:
module SomeModule {
uses somemodule.Logger;
uses somemodule.View;
provides somemodule.Logger with somemodule.LogView;
provides somemodule.View with somemodule.LogView;
}