JEP 104: Type Annotations
Аннотации типов
| Authors | Michael Ernst, Alex Buckley |
| Ответственный | Michael Ernst |
| Тип | Feature |
| Область | SE |
| Статус | Closed / Delivered |
| Выпуск | 8 |
| Компонент | specification / language |
| JSR | 308 |
| Обсуждение | type dash annotations dash dev at openjdk dot java dot net |
| Трудоёмкость | L |
| Длительность | XL |
| Блокирует | JEP 120: Repeating Annotations |
| Рецензенты | Brian Goetz |
| Одобрен | Brian Goetz, Mikael Vidstedt |
| Создан | 2011/09/09 20:00 |
| Обновлён | 2020/06/01 17:38 |
| Задача | 8046094 |
Аннотация
Расширить набор мест в синтаксисе языка программирования Java, где допускаются аннотации. В него должны войти имена, обозначающие использование типа, а не только (как в Java SE 5.0) объявление типа.
Цели
Сделать возможной разработку полезных подключаемых средств проверки типов, которые уточняют встроенную систему типов Java.
Что не является целью
Стандартизация подключаемых средств проверки типов.
Критерии успеха
-
Три крупных подключаемых средства проверки типов, созданных на Java SE 8 с помощью фреймворка, например «Checker Framework» от Ernst.
-
Возможно, применение хотя бы одной схемы аннотаций (например, для контроля значений null) к частям кодовой базы JDK 8. Это может повлечь (а может и не повлечь) стандартизацию определений полезных типов аннотаций (например, @Nullable) в Java SE.
Мотивация
Система аннотаций Java — безусловный успех. Программисты могут писать аннотации к именам типов в объявлениях переменных, методов и классов. Эти аннотации затем читают корпоративные фреймворки для настройки, а компиляторы и IDE — для обеспечения качества ПО. Аннотации позволяют убрать из кода шаблонные фрагменты и выявлять простые ошибки во время компиляции.
Аннотации на использованиях типов, а не только на объявлениях типов, позволяют выявлять ошибки с помощью «подключаемых средств проверки типов». Эти средства усиливают и уточняют встроенную систему типов Java. Усиленная система типов ещё во время компиляции предотвращает такие ошибки качества ПО, которые иначе проявились бы во время выполнения. Примеры: ошибки нулевого указателя, побочные эффекты на неизменяемых данных, состояния гонки, утечка информации и неинтернационализированные строки.
Описание
JSR 308 вносит точечные низкоуровневые изменения в грамматику языка Java. Они разрешают аннотации на именах типов в большинстве мест, где эти имена могут использоваться. Это касается и имён типов в конструкциях языка Java SE 7, таких как try-with-resources и multi-catch.
JSR 308 определяет новые атрибуты формата class-файлов JVM для хранения этих аннотаций на именах типов. Наконец, он вносит точечные изменения в API java.lang.reflect и javax.lang.model, чтобы можно было получать аннотации на конкретных вхождениях имён типов.
Альтернативы
-
Идиоматическое качество ПО на этапе компиляции можно оценивать с помощью инструментов вроде FindBugs, без аннотаций, расставленных программистом.
-
Нотацию, обозначающую аннотацию, можно было бы размещать в комментариях вида /* */ рядом с именем типа и тем самым «скрывать» «аннотацию» от самого языка. Это добавляет визуального шума и всё равно требует изменений в class-файлах и рефлексии.
Тестирование
-
Тесты JCK для конструкций языка Java, которые теперь можно аннотировать, для новых атрибутов class-файлов, генерируемых для аннотированных конструкций выше уровня тела метода, и для нового API рефлексии.
-
Тесты SQE для новых атрибутов class-файлов, генерируемых для аннотированных конструкций ниже уровня тела метода. (Компиляция тела метода зависит от компилятора и поэтому не стандартизирована, так что аннотации на конструкциях внутри тел методов не входят в область JCK.)
-
Тесты SQE возможны для отдельных подключаемых средств проверки типов, но они не входят в JDK 8 или Java SE 8.
Риски и допущения
-
Риск: широкое сообщество разработчиков на Java не заинтересовано в разработке или использовании подключаемых систем типов.
-
Допущение: польза подключаемой проверки типов оправдывает существенные изменения грамматики Java, формата class-файлов и API. (Помимо аннотаций на использованиях типов, JSR 308 улучшает аннотации на объявлениях типов, которые, по общему мнению, должны были появиться ещё в JSR 175. Сами по себе эти улучшения не оправдывают и не предопределяют более широких изменений в JSR 308, но по той же причине они вряд ли появились бы без «поддержки» со стороны 308.)
Влияние
- Другие компоненты JDK: если они аннотированы для конкретного Checker.
- Совместимость: любые парсеры языка Java или class-файлов.
- Документация: javadoc должен отображать аннотации на использованиях типов.
- TCK: изменения языка, class-файлов и рефлексии.