У нас есть проект Java. Мы включаем -Xlint
(включить предупреждения) и -Werror
(обратите внимание на предупреждение как ошибка) для javac
, чтобы убедиться, что наш код не содержит предупреждений. Недавно мы решили отказаться от класса. В некоторых случаях проблема заключается в том, что @SuppressWarnings("deprecation")
не будет подавлять предупреждение об отказе, что приведет к сбою сборки. Ниже приведен список вариантов использования, на которые я столкнулся:Как избежать предупреждений об устаревании, когда @SuppressWarnings ("deprecation") не работает?
- Импортирован из других классов, не относящихся к классу.
- Импортировано из других категоризированных классов.
- Родительский класс.
Тип параметра. Например
@SuppressWarnings("deprecation") public class Foo extends Bar<DeprecatedClass> { ... }
Тем не менее, эта не имеет никакого предупреждения, даже не подавляет:
@Deprecated public class DeprecatedClass extends Bar<DeprecatedClass> { ... }
AFAIK, нет синтаксиса для аннотирования импорта, так что для случая 1 и 2 наше решением является либо импортировать *, либо не импортировать. В случае 3 и 4, как Java 6, так и 7 не подавляют предупреждение. Java 8 будет корректно подавлять его (возможно, ошибка исправлена). Пока нет решения для этого.
К сожалению, на данный момент мы должны поддерживать Java 6, 7 и 8. Есть ли способ справиться с этой проблемой? Это дорожный блок для нашей эволюции Java API.
ADDENDUM
Многие люди спрашивают, почему мы до сих пор используют устаревший класс в собственном коде. Причина в том, что проект представляет собой библиотеку, поддерживающую множество разных клиентов. При внедрении нового API замены мы должны сначала отказаться от нашего старого API, сохранить его в нашей базе кода, дождаться, пока все клиенты перейдут, а затем удалите его. Есть три распространенных варианта использования:
- Мы принизить класс
Foo
иBar
, гдеFoo
проходитBar
. Это вопрос 2 и 3 в моем вопросе. - Мы отказываем классу
Foo
иBar
, гдеFoo
распространяетсяCollection<Bar>
. В этом случае 2 и 4. - Мы должны оставить все тестовые коды для класса
Foo
иBar
. Код теста импортирует эти классы. В этом случае 1.
Зачем хранить тест? Не забывайте, что если обнаружена серьезная ошибка (например, утечка памяти, проблема безопасности), и клиенты не могут легко перейти на новую версию, нам все равно нужно предоставить исправление ошибок для старого API. И все изменения должны быть проверены.
Я считаю, что наша ситуация должна быть довольно распространена в разработке программного обеспечения и разработке API. Удивительно, что для такого исправления Java потребовалось много времени (до Java 8).
Есть, вероятно, не так много вариантов. Вы можете изменить процесс сборки, чтобы не выполнять «-Werror», если не задано значение target = 8, или исключить предупреждения об устаревании, так как это кажется сломанным в 6 и 7. Или вы не выполняете стандартную устаревание (например, неудачная альтернатива): Skip устаревание и сразу удалить плохой класс, «обесценить» его, разместив примечание на веб-сайте/javadoc, или в случае, если это работает, также обесценивает каждый класс, который использует его как параметр типа, даже если он останется в том случае, если устаревший класс будет исчезают. Также http://stackoverflow.com/a/20909204/995891 относительно 1) & 2) – zapl
Я думаю, что не осудить случай 3 и поставить '@ устаревший' в Джавадоке может быть последним, если не существует лучшего подхода. –
Поскольку вы ссылаетесь на него как на тип, а не на класс, можете ли вы расширять его с помощью универсального типа и затем переводить на 'DeprecatedClass' позже, с предупреждением о подавлении? – CharlieS