Метод по умолчанию в интерфейсе - Java - PullRequest
3 голосов
/ 04 июля 2019
import java.util.List;

public interface IEntityParam {

    public void validateParam(Object object);

    public default void validateParam(Object object,List<String> Str){
        validateParam(object);
    }
}

Предположим, IEntityParam - очень старый интерфейс, расширенный многими классами, и мне нужен новый метод.Я добавил новый метод с другим параметром.Но моя реализация по умолчанию не использует новый параметр List в методе по умолчанию.Технически проблем нет.Но правильно ли использовать метод по умолчанию?Или Должен ли я сохранить этот новый метод для определенного класса, так как я не использую второй параметр в реализации по умолчанию.

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

1 Ответ

3 голосов
/ 04 июля 2019

Вероятно, это неправильное использование методов по умолчанию. Известно, что методы по умолчанию способствуют обратной совместимости, когда интерфейсы / контракты развиваются с новыми методами, но проблема в вашем случае заключается в том, что не все реализации IEntityParam заботятся о новой версии "контракта". Методы по умолчанию являются концептуально частью контракта интерфейса.

Обычный способ удовлетворить ваши текущие потребности - это расширить интерфейс:

public interface IEntityParam {
    public void validateParam(Object object);
}

public interface IEntityParamExtended extends IEntityParam {
    public default void validateParam(Object object,List<String> Str);
}

Таким образом, ваш класс, которому нужен второй метод, будет реализовывать IEntityParamExtended и обеспечивать реализацию для обоих методов; в то время как все другие реализации IEntityParam остаются неизменными.

В будущем, когда IEntityParamExtended необходимо повысить до IEntityParam (т. Е. Когда новый метод станет частью контракта IEntityParam), вы можете использовать метод default, чтобы избежать форсирования всех существующих реализаций подлежит изменению и перекомпиляции.

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