openjdk.ruOpenJDK на русском

JEP 211: Elide Deprecation Warnings on Import Statements

Отключение предупреждений об устаревании для инструкций import

АвторJoseph D. Darcy
ОтветственныйJoe Darcy
ТипFeature
ОбластьSE
СтатусClosed / Delivered
Выпуск9
Компонентtools / javac
Обсуждениеcompiler dash dev at openjdk dot java dot net
ТрудоёмкостьS
ДлительностьM
РецензентыBrian Goetz
ОдобренBrian Goetz
Создан2014/05/07 00:45
Обновлён2025/02/25 15:08
Задача8042566

Аннотация

Начиная с Java SE 8, при разумном толковании Java Language Specification (спецификация языка Java) компиляторы Java обязаны выдавать предупреждение об устаревании, когда устаревший тип импортируется по имени или когда устаревший член (метод, поле, вложенный тип) импортируется статически. Эти предупреждения не несут полезной информации, и требовать их не следует. Предупреждения об устаревании в местах фактического использования устаревших членов должны остаться.

Цели

Цель этого JEP — упростить избавление больших кодовых баз от предупреждений lint. Предупреждения об устаревании для импортов нельзя подавить аннотацией @SuppressWarnings, в отличие от предупреждений при использовании устаревших членов в коде. В больших кодовых базах, таких как кодовая база JDK, устаревшую функциональность часто приходится поддерживать ещё какое-то время, и сам по себе импорт устаревшей конструкции не оправдывает предупреждения, если все её использования намеренные и предупреждения для них подавлены.

Что не является целью

Цель этого JEP не в том, чтобы действительно устранить все предупреждения об устаревании в коде JDK. Однако это может быть сделано в рамках отдельной работы по сопровождению кода в JDK 9.

Описание

С точки зрения спецификации нужное изменение невелико. В JLS 8 в разделе о @Deprecated сказано:

Компилятор Java должен выдавать предупреждение об устаревании, когда тип, метод, поле или конструктор, объявление которого помечено аннотацией @Deprecated, используется (переопределяется, вызывается или упоминается по имени) в конструкции, объявленной явно или неявно, за исключением случаев, когда:

  • использование находится внутри сущности, которая сама помечена аннотацией @Deprecated; или
  • использование находится внутри сущности, для которой предупреждение подавлено аннотацией @SuppressWarnings("deprecation"); или
  • использование и объявление находятся внутри одного и того же внешнего класса верхнего уровня.

Изменение спецификации могло бы состоять, например, в добавлении ещё одного пункта с дополнительным исключением:

  • использование находится внутри инструкции import.

В эталонной реализации javac при поиске мест для предупреждений об устаревании добавилась бы простая проверка, пропускающая инструкции import.

Тестирование

Для тестирования этой возможности должно быть достаточно обычных модульных тестов. Возможно, несколько тестов JCK придётся обновить под изменённую спецификацию.