Использование @deprecated с изменением типа параметра в определении метода

Я создаю API для доступа к БД.

Уже есть одно приложение, использующее наш API. В этом случае, если я хочу изменить тип параметра с интерфейса на тип реализации.

Например,

API версия 1.0:

getDomain1Data(SearchBy searchBy,List<String> someList);

Могу ли я изменить это на ниже? Я хочу убедиться, что пользователь API не выполняет поиск domain1 данные с именем столбца таблицы другого домена.

getDomain1Data(Domain1SearchBy searchBy,List<String> someList);

Если я сделаю это, я должен добавить устаревший к первому методу, а затем добавить второй метод, или я могу просто заменить первый метод на второй.

Благодарю.

3 ответа

Решение

Если уже есть приложение, которое использует ваш интерфейсный метод, было бы неразумно удалять предыдущий метод. Я бы лучше добавил getDomain1Data(Domain1SearchBy searchBy,List<String> someList); и добавить @Deprecated аннотация к предыдущему.

Образец кода:

@Deprecated
static interface SearchBy {
}
static class Domain1SearchBy implements SearchBy {
}

static interface Api10 {
    void some(SearchBy a);
}
static interface Api11 extends Api10 {
    void some(Domain1SearchBy b);
}

static class Api10Impl implements Api10 {
    @Deprecated
    public void some(SearchBy a) {
        System.out.println("some searchby");
    }
}
static class Api11Impl extends Api10Impl implements Api11 {
    public void some(Domain1SearchBy b) {
        System.out.println("some domain1");
    }
}

public static void main(String[] args) {

    //with api 1.0
    Api10 api10 = new Api10Impl();
    api10.some(new SearchBy() {});
    api10.some(new Domain1SearchBy());

    //with api 1.1
    Api11 api11 = new Api11Impl();
    api11.some(new SearchBy() {});
    api11.some(new Domain1SearchBy());

}

Результат:

some searchby
some searchby
some searchby
some domain1

Вы не можете просто заменить первый на второй, потому что клиент может вызвать его SearchBy объект как фактический параметр. Это может привести к ошибке компиляции.

Наличие обоих методов также невозможно, потому что они неоднозначны. Если вызвано с Domain1SearchBy Объект оба метода будут применимы, поэтому не может быть решено, какой из них использовать.

Ваши только две опции дают новое имя другому или изменяют количество параметров.

Если вы меняете используемые методы, как и в этом случае, то я думаю, что правильным способом было бы добавить новый метод и добавить тег @Deprecated к старому методу с объяснением того, почему он был устарел, и какой метод следует использовать вместо.

Другие вопросы по тегам