Java: Как избежать устаревшего предупреждения в производных интерфейсах, которые переопределяют устаревшие элементы?
Рассмотрим следующую упрощенную иерархию наследования интерфейсов:
// 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() в интерфейсе Base устарела
Как ни странно, если я удалю @Deprecated
из документации в Base
(но оставьте @Deprecated), это предупреждение исчезнет.
Правильно ли, что я получаю это предупреждение, и если да, то как я могу обойти это?
Предупреждение, кажется, сообщает, что Derived.Foo
"использует" Base.Foo
(который устарел). Но единственной способностью, в которой Derived.Foo
является "использование" устаревшего Base.Foo
, является его переопределение. Это говорит о том, что вы не можете переопределить устаревшие методы интерфейса в производных методах.
Если это так, должен ли я затем украсить Derived
@SuppressWarnings("deprecation")
, чтобы пресечь предупреждение?
Ответы
Ответ 1
Я считаю, что ваше требование действительно, я не сомневаюсь, что отменять устаревший метод - это правильный путь.
Я считаю, что разница между @deprecated и @Deprecated в основном историческая. @Deprecated является официальным способом в java 5, но является новым, поэтому мы должны удвоить его с помощью @deprecated.
Также обратите внимание, что, к сожалению, @Deprecated не позволяет вам указывать информацию.. в то время как информация обычно необходима, например, чтобы сообщить, что следует использовать в качестве замены, или когда ожидается, что устаревший метод будет полностью удален.
Не зная больше, и знание проблемы исчезнет, как только вы удалите супер метод, я бы использовал @SuppressWarnings ( "derecation" ), возможно, с комментарием для ваших преемников, чтобы понять... (и другое комментарий супер-метода, чтобы сказать им удалить все это при удалении метода).; -)
Ответ 2
Если вы добавите @Deprecated в свою производную декларацию Foo(), я верю, что предупреждение исчезнет.
public interface Derived extends Base {
@Deprecated void Foo();
}
Ответ 3
Если я правильно понял, вам нужно @SuppressWarnings ( "derecation" ) в начале ваших классов, которые реализуют устаревший интерфейс/функцию. Или я здесь отсюда?
Ответ 4
Невозможно выполнить то, что вы хотите.
Отсрочка - относительно простой механизм и не поддерживает этот прецедент.
Как работает эта усталость, все, что ссылается на устаревший метод или поле, генерирует предупреждение.
Единственным исключением является то, что код, использующий устаревшее метод/поле, устарел.