一个解决方案已与 Java 模块一起添加,但需要注意的是它仅适用于显式模块,即模块信息中的服务声明,而不是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;
}
以下代码打印true
:
View v = ServiceLoader.load(View.class).findFirst().orElseThrow();
Logger l = ServiceLoader.load(Logger.class).findFirst().orElseThrow();
System.out.println(v == l);