Java - интерфейс, позволяющий реализациям указывать список параметров - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть этот случай, когда я хочу внедрить услугу предложения. Предполагается, что это услуга, которую пользователи могут вызывать для извлечения предположительных значений для определенных, определенных полей. Скажем, я хочу предложения для автомобиля и мобильных телефонов. Эти поля являются фиксированными, и, таким образом, я могу жестко закодировать метод для каждого в интерфейсе службы.

Однако реализация реальной службы должна быть бесплатной, чтобы определить, как она получает эти предложения. Это может посмотреть в файл, это может вызвать веб-сервис, что угодно. Для этого он также должен иметь возможность определить, какие параметры необходимы для извлечения этих предложений. Некоторым реализациям может потребоваться больше информации, другим - меньше. То же самое для того, что он возвращает: некоторые реализации могут возвращать одно значение, другие - несколько.

Я хочу отразить это в интерфейсе службы, поэтому я пишу это так:

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 должен быть в состоянии сообщить пользователям о том, какие параметры ему действительно нужны - указав их в сигнатуре метода. Здесь происходит странный конфликт интересов, и я не могу найти решение, чтобы решить эту проблему. С одной стороны, я хочу написать и использовать интерфейс, который должны быть реализованы в реальных реализациях. Таким образом, я могу убедиться, что все реализации предоставляют методы для поиска интересующих меня полей - в данном случае это автомобиль и мобильный телефон. Однако интерфейс реализаций должен иметь возможность точно указывать своим пользователям, какие параметры какого типа ему нужны, и не принимать какой-либо общий список параметров, предоставляя пользователю возможность передавать правильные. Есть ли способ объединить эти два желания?

1 Ответ

0 голосов
/ 06 ноября 2019

Сигнатура по-прежнему является интерфейсом, для них не требуется, чтобы все они были гомогенизированы в похожие выглядящие вызовы, когда их нет.

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

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

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

Это позволяет вам сохранить (итест) дискретные подсказки с простым шаблоном фасада, чтобы свести их вместе в один импл (до вас, если вам нужны также дискретные имплс - предположите, что это вполне разумно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...