Java-允许实现指定参数列表的接口

在这种情况下,我想实施建议服务。假定这是一项服务,用户可以调用该服务来检索某些已定义字段的建议值。假设我想要有关汽车和手机的建议。这些字段是固定的,因此我可以在服务的界面中为每个字段硬编码一个方法。

但是,实际服务的实现应该可以自由确定它如何检索这些建议。它可能会查看文件,也可能会调用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应该能够告诉用户它实际上需要什么参数-通过在方法签名中指定它们。这里有一个奇怪的利益冲突,我无法提出解决方案。一方面,我想编写和使用实际实现需要实现的接口。这样,我可以确保所有实现都提供用于检索我感兴趣的字段的方法-在这种情况下为汽车和手机。但是,实现接口应该能够准确地告诉用户它需要哪种类型的参数,并且不接受任何通用的参数列表,而是将其传递给用户以传递正确的参数。有什么办法可以将这两个愿望结合起来?

dabengua5527 回答:Java-允许实现指定参数列表的接口

签名仍然是一个接口,不需要将它们全部均化为相似的外观调用。

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保留(并测试)离散的建议者,将它们汇总到一个展示中(如果您还需要离散的显示,则由您决定-建议这样做很明智)

本文链接:https://www.f2er.com/3152508.html

大家都在问