Лямбда-выражения — безусловно, самая обсуждаемая и продвигаемая особенность 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 .