Java:Как избежать устаревшего предупреждения в производных интерфейсах, которые переопределяют устаревшие члены?
-
06-07-2019 - |
Вопрос
Рассмотрим следующую упрощенную иерархию наследования интерфейса:
// Starting point:
public interface Base {
void Foo();
}
public interface Derived extends Base {
}
Он предназначен для перемещения Foo
метод из Base
интерфейс к Derived
интерфейс:
// Desired end-point:
public interface Base {
}
public interface Derived extends Base {
void Foo();
}
Для поэтапного внесения этого критического изменения желательно сохранить обратную совместимость Base
интерфейс на некоторое время.
Это может быть достигнуто путем маркировки метода на Base
интерфейс как @Deprecated
:
// Intermediate state:
public interface Base {
/**
* @deprecated This method is deprecated as of release X. Derived.Foo should be used instead.
*/
@Deprecated void Foo();
}
public interface Derived extends Base {
void Foo();
}
Когда я компилирую этот код, я получаю предупреждение компилятора о Derived
:
[устаревание] Foo() в интерфейсной базе устарел
Как ни странно, если я удалю @deprecated
из документации в Base
(но оставьте @Deprecated) это предупреждение исчезает.
Правильно ли, что я получаю это предупреждение, и если да, то как я могу обойти это?
Предупреждение, по-видимому, сообщает о том, что Derived.Foo
является ли "использование" Base.Foo
(который устарел).Но единственная емкость, в которой Derived.Foo
является ли "использование" устаревшим Base.Foo
заключается в том, чтобы переопределить его.Это, по-видимому, говорит о том, что вам не разрешается переопределять устаревшие методы интерфейса в производных методах.
Если это так, должен ли я тогда украсить Derived
с @SuppressWarnings("deprecation")
чтобы подавить предупреждение?
Решение
Я считаю, что ваше требование действительно, я не сомневаюсь, что переопределение устаревшего метода - это правильный путь.
Я считаю, что разница между @deprecated и @Deprecated в основном историческая.@Deprecated - это официальный способ в java 5, но он новый, поэтому ожидается, что мы удвоим его с помощью @deprecated .
Также обратите внимание, что, к сожалению, @Deprecated не позволяет вам указывать информацию ..хотя обычно требуется информация, например, чтобы указать, что следует использовать в качестве замены, или когда ожидается, что устаревший метод будет полностью удален.
Не зная больше и зная, что проблема исчезнет, как только вы эффективно удалите super метод, я бы использовал @SuppressWarnings ("устаревание"), возможно, с комментарием для понимания вашими преемниками ...(и еще один комментарий к суперметоду, чтобы сказать им удалить все это при удалении метода).;-)
Другие советы
если я правильно понимаю, вам нужен @SuppressWarnings (" deprecation ") в начале ваших классов, которые реализуют устаревший интерфейс / функцию. Или я далеко от базы?
Если вы добавите @Deprecated к производному объявлению Foo (), я считаю, что предупреждение исчезнет.
public interface Derived extends Base {
@Deprecated void Foo();
}
Нет способа выполнить то, что вы хотите. Р>
Устаревание является относительно простым механизмом и не поддерживает этот вариант использования.
Метод устаревания работает так, что все, что ссылается на устаревший метод или поле, генерирует предупреждение. Р>
Единственное исключение - если сам код, использующий устаревший метод / поле, устарел.