gpt4 book ai didi

java - 使用 ServiceLoader 获取提供多个服务的服务提供者类的同一实例

转载 作者:行者123 更新时间:2023-11-30 02:02:44 28 4
gpt4 key购买 nike

我遇到问题,但不知道如何解决

假设我有两个服务提供商接口(interface) (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)。有没有办法让我可以从两次调用中获取相同的对象实例?

这个想法是,在将 View 加载为 GUI 后,我希望能够登录 GUI 的同一实例,而不是另一个实例。就目前情况而言,我陷入了两个单独的实例,因此日志确实显示了。

最佳答案

解决方案已与 Java 模块一起添加,但需要注意的是,它适用于显式模块,即使用模块信息中的服务声明,而不是 中的文件META-INF/服务

然后,您可以声明一个 public static Tprovider() 方法来代替公共(public)默认构造函数,而返回类型 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;
}

以下代码打印 true:

View v = ServiceLoader.load(View.class).findFirst().orElseThrow();
Logger l = ServiceLoader.load(Logger.class).findFirst().orElseThrow();
System.out.println(v == l);

关于java - 使用 ServiceLoader 获取提供多个服务的服务提供者类的同一实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52275271/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com