簡體   English   中英

Java - 允許實現指定參數列表的接口

[英]Java - Interface to allow implementations to specify parameter list

我有這種情況,我想實施建議服務。 這應該是一種服務,用戶可以調用它來檢索某些已定義字段的建議值。 假設我想要關於汽車和手機的建議。 這些字段是固定的,因此我可以在服務接口中為每個字段硬編碼一個方法。

但是,實際服務的實現應該可以自由地確定它如何檢索這些建議。 它可能會查看一個文件,它可能會調用一個 Web 服務,等等。 為此,它還應該能夠確定檢索這些建議所需的參數。 有些實現可能需要更多信息,有些可能需要更少。 它返回的內容相同:某些實現可能返回單個值,而其他實現可能返回多個。

我想在服務的界面中體現這一點,所以我這樣寫:

public interface SuggestionService {
    SuggestionResult getCarSuggestion(final SuggestionCriteria criteria);
    SuggestionResult getMobilephoneSuggestion(final SuggestionCriteria criteria);
}

SuggestionResultSuggestionCriteria都是接口。 SuggestionService的實現可以使用他們自己的這兩個接口的實現來正確地提供功能。 這對於返回類型非常有效,因為我可以在我的方法實現中縮小它們:

public class SuggestionServiceImpl implements SuggestionService {
    public CarSuggestionResult getCarSuggestion(final SuggestionCriteria criteria) {...}
    public MobilephoneSuggestionResult getMobilephoneSuggestion(final SuggestionCriteria criteria) {...}
}

問題是我無法更改參數類型。 如果我在SuggestionServiceImpl中這樣做

public CarSuggestionResult getCarSuggestion(final CarSuggestionCriteria criteria) {...}

然后我得到一個編譯錯誤。 這是有道理的,因為我現在通過減少允許的參數類型的數量來縮小我試圖實現的接口。 出於充分的理由,這是不允許的。

但是,我覺得SuggestionServiceImpl應該能夠告訴用戶它實際需要哪些參數——通過在它的方法簽名中指定它們。 這里有一個奇怪的利益沖突,我無法想出解決這個問題的解決方案。 一方面,我想編寫和使用實際實現需要實現的接口。 通過這種方式,我可以確保所有實現都提供檢索我感興趣的字段的方法——在本例中為汽車和手機。 但是,實現接口應該能夠准確地告訴用戶它需要什么類型的參數,並且不接受任何通用參數列表,讓用戶傳遞正確的參數。 有沒有辦法把這兩種欲望結合起來?

簽名仍然是一個接口,沒有要求它們都被同質化為看起來相似的調用。

public interface CarSuggester {
    Car getCarSuggestion(String param1);
}

public interface PhoneSuggester {
    List<Phone> getPhoneSuggestion(int param1, String param2);
}

public class SuggestionService implements CarSuggester, PhoneSuggester {
    ...
}

這讓您可以使用簡單的 Facade Pattern 保留(並測試)離散的建議器,以將它們組合成一個 impl(如果您也需要離散的 impl,則由您決定 - 建議它可能是明智的)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM