Статьи

Java 8 Тип аннотации

Лямбда-выражения — безусловно, самая обсуждаемая и продвигаемая особенность Java 8. Хотя я согласен с тем, что лямбда-выражения являются значительным улучшением, я думаю, что некоторые другие функции Java 8 идут немного быстрее из-за шумихи по поводу лямбды. В этом посте я хочу показать несколько примеров из другой замечательной функции Java 8: аннотации типов.

Аннотации типов — это аннотации, которые можно размещать везде, где вы используете тип. Это включает в себя оператор new, приведение типов, реализации элементов и предложений throws. Аннотации типов позволяют улучшить анализ кода Java и могут обеспечить еще более строгую проверку типов.

В исходном коде это означает, что мы получаем два новых ElementTypes для аннотаций:

1
2
3
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
public @interface Test {
}

Значение перечисления TYPE_PARAMETER позволяет применять аннотацию к переменным типа (например, MyClass <T>). Аннотации с целевым значением TYPE_USE могут применяться при любом использовании.

Обратите внимание, что аннотации из следующих примеров не будут работать сразу после выхода Java 8. Java 8 предоставляет только возможность определять эти типы аннотаций. Затем сами разработчики фреймворка и инструмента могут его использовать. Так что это коллекция фреймворков для аннотаций, которые мы можем предоставить в будущем. Большинство примеров взяты из спецификации аннотаций типов и различных презентаций Java 8.

Простые определения типов с аннотациями типов выглядят так:

1
2
3
@NotNull String str1 = ...
@Email String str2 = ...
@NotNull @NotBlank String str3 = ...

Аннотации типов также могут применяться к вложенным типам

1
Map.@NonNull Entry = ...

Конструкторы с аннотациями типов:

1
2
new @Interned MyObject()
new @NonEmpty @Readonly List<String>(myNonEmptyStringSet)

Они также работают с вложенными (не статичными) конструкторами классов:

1
myObject.new @Readonly NestedClass()

Тип бросков:

1
2
myString = (@NonNull String) myObject;
query = (@Untainted String) str;

Наследование:

1
class UnmodifiableList<T> implements @Readonly List<T> { ... }

Мы можем использовать аннотации типов с аргументами универсального типа:

1
2
3
List<@Email String> emails = ...
List<@ReadOnly @Localized Message> messages = ...
Graph<@Directional Node> directedGraph = ...

Конечно, мы можем их вкладывать:

1
Map<@NonNull String, @NonEmpty List<@Readonly Document>> documents;

Или примените их к типам пересечения:

1
public <E extends @ReadOnly Composable<E> & @Localized MessageSource> void foo(...) { ... }

Включая границы параметров и подстановочные знаки:

1
2
3
class Folder<F extends @Existing File> { ... }
Collection<? super @Existing File> c = ...
List<@Immutable extends Comparable<T>> unchangeable = ...

Общий вызов метода с аннотациями типов выглядит следующим образом:

1
myObject.<@NotBlank String>myMethod(...);

Для универсальных конструкторов аннотация следует за аргументами явного типа:

1
new <String> @Interned MyObject()

Бросать исключения:

1
2
void monitorTemperature() throws @Critical TemperatureException { ... }
void authenticate() throws @Fatal @Logged AccessDeniedException { ... }

Введите аннотации в операторах instanceof:

1
2
boolean isNonNull = myString instanceof @NonNull String;
boolean isNonBlankEmail = myString instanceof @NotBlank @Email String;

И, наконец, ссылки на методы и конструкторы Java 8:

1
2
3
@Vernal Date::getDay
List<@English String>::size
Arrays::<@NonNegative Integer>sort

Вывод

Аннотации типов являются интересным дополнением к системе типов Java. Они могут применяться к любому использованию типа и позволяют более детально анализировать код. Если вы хотите использовать аннотации Type прямо сейчас, вы должны взглянуть на Checker Framework .

Ссылка: Java 8 Type Annotations от нашего партнера JCG Майкла Шаргага в блоге mscharhag, Programming and Stuff .