1 回答

TA贡献1856条经验 获得超17个赞
随着 Java 模块的引入,通过默认构造函数进行实例化的替代方法已添加到服务提供者中。但它仅在提供程序位于命名模块中时才有效。
提供者类可以声明服务类型public static T provider()所在的方法。T然后,提供者实现类甚至不需要实现或扩展T自身。
由于数组和泛型类型List<ImageType>都不能用作服务类型,因此我们需要另一种类型来潜在地封装多个实际实例,例如
package somemodule;
import java.util.function.Supplier;
public interface ImageType {
String name();
interface ImageTypes extends Supplier<ImageType[]> {}
}
和
package somemodule;
public enum StandardImageType implements ImageType {
IMAGE,
VECTOR,
RASTER,
HANDWRITING,
ICON,
LOGO,
SEAL,
RULE,
BARCODE;
public static ImageTypes provider() {
return StandardImageType::values;
}
}
和一个模块声明,如
module SomeModule {
uses somemodule.ImageType.ImageTypes;
provides somemodule.ImageType.ImageTypes with somemodule.StandardImageType;
}
允许写,例如
List<ImageType> all = ServiceLoader.load(ImageType.ImageTypes.class)
.stream().flatMap(p -> Arrays.stream(p.get().get()))
.collect(Collectors.toList());
模块内的某处(或任何其他带有uses somemodule.ImageType.ImageTypes;声明的模块)。
添加回答
举报