У нас есть проект Java. Мы включаем флаги -Xlint
(включить предупреждения) и -Werror
(лечить предупреждение как ошибку) для javac
, чтобы убедиться, что наш код не содержит предупреждений. Недавно мы решили отказаться от класса. Проблема в том, что в некоторых случаях @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.
ДОПОЛНЕНИЕ
Многие спрашивают, почему мы все еще используем устаревший класс в нашей собственной базе кода. Причина в том, что проект представляет собой библиотеку, поддерживающую множество разных клиентов. При внедрении нового API замены мы должны сначала отказаться от нашего старого API, сохранить его в нашей базе кода, дождаться, пока все клиенты перейдут, а затем удалите его. Существует три распространенных случая использования:
- Мы осуждаем класс
Foo
иBar
, гдеFoo
продолжаетсяBar
. Это вопрос 2 и 3 в моем вопросе. - Мы осуждаем класс
Foo
иBar
, гдеFoo
продолжаетсяCollection<Bar>
. Это случай 2 и 4. - Мы должны сохранить все тестовые коды для классов
Foo
иBar
. Код теста импортирует эти классы. В этом случае 1.
Зачем держать тест? Не забывайте, что если обнаружена серьезная ошибка (например, утечка памяти, проблема безопасности), и клиенты не могут легко перейти на новую версию, нам все равно нужно предоставить исправление ошибок для старого API. И все изменения должны быть протестированы.
Я считаю, что наша ситуация должна быть довольно распространена в разработке программного обеспечения и разработке API. Удивительно, что для такого исправления Java потребовалось много времени (до Java 8).