亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

枚舉感知的 ServiceLoader 實現?

枚舉感知的 ServiceLoader 實現?

函數式編程 2022-06-23 10:06:56
我希望能夠將枚舉類型指示為接口實現,然后通過ServiceLoaderAPI 將所有枚舉加載為接口的單獨實例/實現。此用例的一個示例是允許我的 API 的下游用戶指定自定義值,但提供具有標準/通用實現的枚舉。我的接口只需要一個 String name(),所以任何枚舉都已經實現了它。例如,CopyOptionJava NIO API 中的接口,帶有提供的StandardCopyOption枚舉。假設我想將所有CopyOptions,甚至是類路徑上的新 s 連同標準一起加載到單個迭代器中ServiceLoader(或者我愿意接受其他建議?。┪医K于通過批量復制和修改它以在實例化失敗時ServiceLoader嘗試使用它來工作(其中的部分是它當前的工作方式,而其中的部分是我添加/更改的部分):getEnumConstantstrycatchtry {    S p = service.cast(c.newInstance());    providers.put(cn, p);    return p;} catch (Throwable x) {    Object[] arr = c.getEnumConstants();    if (arr == null || arr.length == 0) {        fail(service, "Provider " + cn + " could not be instantiated", x);      }    List<S> list = new LinkedList<>();    for (Object o : arr) {        Enum<?> e = (Enum<?>) o;        S p = service.cast(e);        providers.put(cn + e.ordinal(), p);        list.add(p);    }    subiter = list.iterator();    return subiter.next();}我還添加了一些代碼,如果subiter存在并且有下一個,則在繼續下一個類名之前對其進行迭代。我的問題是:有沒有更好的方法?如果最終用途不明確,現在可以通過上述修改實現:interface ImageType {    String name();}@AutoService(ImageType.class)enum StandardImageType implements ImageType {    IMAGE,    VECTOR,    RASTER,    HANDWRITING,    ICON,    LOGO,    SEAL,    RULE,    BARCODE}
查看完整描述

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;聲明的模塊)。


查看完整回答
反對 回復 2022-06-23
  • 1 回答
  • 0 關注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號