Лямбда-выражения — безусловно, самая обсуждаемая и продвигаемая особенность 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::getDayList<@English String>::sizeArrays::<@NonNegative Integer>sort |
Вывод
Аннотации типов являются интересным дополнением к системе типов Java. Они могут применяться к любому использованию типа и позволяют более детально анализировать код. Если вы хотите использовать аннотации Type прямо сейчас, вы должны взглянуть на Checker Framework .