1 回答

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個(gè)贊
隨著 Java 模塊的引入,通過默認(rèn)構(gòu)造函數(shù)進(jìn)行實(shí)例化的替代方法已添加到服務(wù)提供者中。但它僅在提供程序位于命名模塊中時(shí)才有效。
提供者類可以聲明服務(wù)類型public static T provider()所在的方法。T然后,提供者實(shí)現(xiàn)類甚至不需要實(shí)現(xiàn)或擴(kuò)展T自身。
由于數(shù)組和泛型類型List<ImageType>都不能用作服務(wù)類型,因此我們需要另一種類型來潛在地封裝多個(gè)實(shí)際實(shí)例,例如
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;
}
}
和一個(gè)模塊聲明,如
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());
模塊內(nèi)的某處(或任何其他帶有uses somemodule.ImageType.ImageTypes;聲明的模塊)。
添加回答
舉報(bào)