第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

枚舉感知的 ServiceLoader 實(shí)現(xiàn)?

枚舉感知的 ServiceLoader 實(shí)現(xiàn)?

函數(shù)式編程 2022-06-23 10:06:56
我希望能夠?qū)⒚杜e類型指示為接口實(shí)現(xiàn),然后通過ServiceLoaderAPI 將所有枚舉加載為接口的單獨(dú)實(shí)例/實(shí)現(xiàn)。此用例的一個(gè)示例是允許我的 API 的下游用戶指定自定義值,但提供具有標(biāo)準(zhǔn)/通用實(shí)現(xiàn)的枚舉。我的接口只需要一個(gè) String name(),所以任何枚舉都已經(jīng)實(shí)現(xiàn)了它。例如,CopyOptionJava NIO API 中的接口,帶有提供的StandardCopyOption枚舉。假設(shè)我想將所有CopyOptions,甚至是類路徑上的新 s 連同標(biāo)準(zhǔn)一起加載到單個(gè)迭代器中ServiceLoader(或者我愿意接受其他建議?。┪医K于通過批量復(fù)制和修改它以在實(shí)例化失敗時(shí)ServiceLoader嘗試使用它來工作(其中的部分是它當(dāng)前的工作方式,而其中的部分是我添加/更改的部分):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存在并且有下一個(gè),則在繼續(xù)下一個(gè)類名之前對(duì)其進(jìn)行迭代。我的問題是:有沒有更好的方法?如果最終用途不明確,現(xiàn)在可以通過上述修改實(shí)現(xiàn):interface ImageType {    String name();}@AutoService(ImageType.class)enum StandardImageType implements ImageType {    IMAGE,    VECTOR,    RASTER,    HANDWRITING,    ICON,    LOGO,    SEAL,    RULE,    BARCODE}
查看完整描述

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


查看完整回答
反對(duì) 回復(fù) 2022-06-23
  • 1 回答
  • 0 關(guān)注
  • 135 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)