У меня есть этот случай, когда я хочу внедрить услугу предложения. Предполагается, что это услуга, которую пользователи могут вызывать для извлечения предположительных значений для определенных, определенных полей. Скажем, я хочу предложения для автомобиля и мобильных телефонов. Эти поля являются фиксированными, и, таким образом, я могу жестко закодировать метод для каждого в интерфейсе службы.
Однако реализация реальной службы должна быть бесплатной, чтобы определить, как она получает эти предложения. Это может посмотреть в файл, это может вызвать веб-сервис, что угодно. Для этого он также должен иметь возможность определить, какие параметры необходимы для извлечения этих предложений. Некоторым реализациям может потребоваться больше информации, другим - меньше. То же самое для того, что он возвращает: некоторые реализации могут возвращать одно значение, другие - несколько.
Я хочу отразить это в интерфейсе службы, поэтому я пишу это так:
public interface SuggestionService {
SuggestionResult getCarSuggestion(final SuggestionCriteria criteria);
SuggestionResult getMobilephoneSuggestion(final SuggestionCriteria criteria);
}
Оба SuggestionResult
и SuggestionCriteria
являются интерфейсами. Реализации 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
должен быть в состоянии сообщить пользователям о том, какие параметры ему действительно нужны - указав их в сигнатуре метода. Здесь происходит странный конфликт интересов, и я не могу найти решение, чтобы решить эту проблему. С одной стороны, я хочу написать и использовать интерфейс, который должны быть реализованы в реальных реализациях. Таким образом, я могу убедиться, что все реализации предоставляют методы для поиска интересующих меня полей - в данном случае это автомобиль и мобильный телефон. Однако интерфейс реализаций должен иметь возможность точно указывать своим пользователям, какие параметры какого типа ему нужны, и не принимать какой-либо общий список параметров, предоставляя пользователю возможность передавать правильные. Есть ли способ объединить эти два желания?