我有一个案例,我想实现建议服务。这应该是一项服务,用户可以调用该服务来检索某些已定义字段的建议值。假设我想要有关汽车和手机的建议。这些字段是固定的,因此我可以在服务接口(interface)中为每个字段硬编码一个方法。
但是,实际服务的实现应该可以自由决定如何检索这些建议。它可能会查看文件,可能会调用网络服务,等等。为此,它还应该能够确定检索这些建议所需的参数。有些实现可能需要更多信息,有些可能需要更少信息。它返回的内容相同:某些实现可能返回单个值,其他实现可能返回多个值。
我想在服务的接口(interface)中体现这一点,所以我这样写:
public interface SuggestionService {
SuggestionResult getCarSuggestion(final SuggestionCriteria criteria);
SuggestionResult getMobilephoneSuggestion(final SuggestionCriteria criteria);
}
SuggestionResult
和SuggestionCriteria
都是接口(interface)。 SuggestionService
的实现可以使用它们自己的这两个接口(interface)的实现来正确提供功能。这对于返回类型非常有效,因为我可以在我的方法实现中缩小它们的范围:
public class SuggestionServiceImpl implements SuggestionService {
public CarSuggestionResult getCarSuggestion(final SuggestionCriteria criteria) {...}
public MobilephoneSuggestionResult getMobilephoneSuggestion(final SuggestionCriteria criteria) {...}
}
问题是我无法更改参数类型。如果我在 SuggestionServiceImpl
public CarSuggestionResult getCarSuggestion(final CarSuggestionCriteria criteria) {...}
然后我得到一个编译错误。这是有道理的,因为我现在已经通过减少允许的参数类型的数量来缩小我试图实现的接口(interface)范围。出于充分的理由,这是不允许的。
但是,我觉得 SuggestionServiceImpl 应该能够通过在方法签名中指定参数来告诉用户它实际需要哪些参数。这里存在奇怪的利益冲突,我无法想出解决方案来解决这个问题。一方面,我想编写并使用实际实现需要实现的接口(interface)。这样我就可以确保所有实现都提供用于检索我感兴趣的字段的方法 - 在本例中为汽车和手机。但是,实现接口(interface)应该能够准确地告诉用户它需要什么类型的参数,并且不接受任何通用参数列表,而是让用户传递正确的参数。有什么办法可以将这两种愿望结合起来吗?
最佳答案
签名仍然是一个接口(interface),不需要将它们全部同质化为类似的外观调用(当它们不是时)。
public interface CarSuggester {
Car getCarSuggestion(String param1);
}
public interface PhoneSuggester {
List<Phone> getPhoneSuggestion(int param1, String param2);
}
public class SuggestionService implements CarSuggester, PhoneSuggester {
...
}
这让您可以使用简单的外观模式保留(并测试)离散的建议,将它们组合成一个单一的 impl(如果您也需要离散的 impl,则由您决定 - 建议这可能是明智的)
关于Java - 允许实现指定参数列表的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58729454/