2. Аннотации в Java — это механизм, позволяющий добавлять
в созданный код, некую дополнительную информацию,
называемую метаданными. Эта информация может
использоваться на этапе компиляции кода, на этапе сборки
приложения или на этапе выполнения. Аннотации появились
в Java начиная с версии Java 5.
Есть аннотации, встроенные в язык Java его разработчиками, a еще
есть механизм, позволяющий программисту создавать свои
собственные аннотации.
В краткой форме описания аннотация выглядит так:
@AnnotationName
3. Аннотация также может содержать атрибуты,
тогда она будет выглядеть так:
@AnnotationName (attribute1 = "value1",
attribute2 = "value2"),
где attribute1 и attribute2 — имена атрибутов,
а value1 и value2 — значения атрибутов.
4. Есть аннотации, встроенные в язык Java его
разработчиками.
Это, например, такие аннотации:
@Deprecated
@Override
@SuppressWarnings
5. @Deprecated
Аннотация говорит о том, что объект, перед
которым она расположена уже считается
устаревшим и скоро будет удален из
реализации языка. Во время компиляции,
компилятор будет выдавать
предупреждающие сообщения о каждом
случае использования устаревшего объекта.
6. @Override
Используется в классе наследнике перед
переопределяемым методом базового класса. Данный
атрибут не является обязательным и переопределение
метода можно выполнять и без него. Однако,
рекомендуется всегда указывать этот атрибут перед
переопределяемыми методами, чтобы человек,
работающий с классом, понимал, что такие методы
определены в базовом классе, и при их переопределении
требуется сохранять соответствие сигнатуры. Если вы не
укажете эту аннотацию при переопределении методов
базового класса, компилятор выведет вам
предупреждение о том, что метод в классе наследнике не
переопределяет метод базового класса.
7. @SuppressWarnings
Используется для того, чтобы подавлять
предупреждения компилятора, например, об
использовании небезопасного
преобразования типов, об использовании
устаревших методов и т.п.
8. Пользовательские аннотации
Пользователь может создавать свои
собственные аннотации. Рассмотрим этот
процесс. Аннотация создается в собственном
отдельном файле, как класс или интерфейс.
Определяется аннотация таким образом:
10. Создавая свою аннотацию, вы можете указать
к каким элементам она должна применяться.
Если бы мы хотели указать при определении
нашей аннотации, что она должна
применяться только к типам (классам,
интерфейсам, перечислениям), то наше
определение примет следующий вид:
11. Класс ElementType содержит такие допустимые
значения для области применимости аннотации:
ElementType.ANNOTATION_TYPE
ElementType.CONSTRUCTOR
ElementType.FIELD
ElementType.LOCAL_VARIABLE
ElementType.METHOD
ElementType.PACKAGE ElementType.PARAMETER
ElementType.TYPE
12. Если при определении своей аннотации
указать еще аннотацию @Inherited, то
созданная вами аннотация будет
передаваться и классам наследникам, если
таковые будут у вашего класса.
15. Важно!
Чтобы иметь возможность получить доступ к
аннотации через рефлексию, у сигнатуры
аннотации должен быть активирован флаг
@Retention(RetentionPolicy.RUNTIME)
16. Отличие TYPE от TYPE_USE
TYPE_USE может использоваться для
аннотирования анонимных классов.
TYPE нет.
24. В переопределении интерфейсов мы можем
задать свои переменные в теле анонимного
класса, но не можем в конструкторе, т.к. у
него нет такого конструктора.
25. Если же в классе создать конструктор с
параметрами, можно использовать и его при
создании анонимных классов
26. Также, с его помощью мы можем передавать методы в
объекты, которые до этого не были созданы
27. Lambda выражения
Это метод, записанный в сокращенном
варианте.
Имеет синтаксис
[параметры] -> {[тело метода]}
Применяется, в основном, в Stream API, при
работе с функциональными классами
29. Это выглядит ужасно громоздко.
Особенно, когда таких блоков требуется
создать несколько.
Для повышения удобства и были созданы
lambda-методы (с Java 8)
30.
31. Код на слайде выше идентичен. Различается
только запись.
32. Lambda
Может принимать 0, 1 либо несколько
параметров
Если у нас 1 параметр, мы можем как
указывать его в скобках, так и указать без
скобок
46. Но это переменная все равно
обязана оставаться final (не должна
меняться)
47. По умолчанию, такой параметр
implicilty (неявно) final
Внутри тела выражения также менять эту
переменную нельзя!
48. Также используется для
функционального
программирования
Когда мы lambda-выражение хотим
использовать множество раз.
• Это возможность использовать чистую
функцию без доп. эффектов
• Чище код
• Чистая функция, которая не изменяет
состояние объекта (implicitly final, помните?)
• Либо использовать в качестве callback’ов
58. Для того чтобы самому создать
функциональный интерфейс
Можно пометить его аннотацией
@FunctionalInterface, но это будет просто для
читаемости. Это ни на что не влияет
59. По сути
Нам надо создать сигнатуру метода в
интерфейсе, чем выходной , определен (void
либо Generic), и входной будет Generic