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

JEP 104: Type Annotations

Аннотации типов

AuthorsMichael Ernst, Alex Buckley
ОтветственныйMichael Ernst
ТипFeature
ОбластьSE
СтатусClosed / Delivered
Выпуск8
Компонентspecification / language
JSR308
Обсуждение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-файлов и рефлексии.