Перечисления, автоупаковка, аннотации. Язык Java. (Лекция 5)

Содержание

Слайд 2

Перечисления РГРТУ, 2020 Перечисление - это список именованных и логически связанных

Перечисления

РГРТУ, 2020

Перечисление - это список именованных и логически связанных констант.
Перечисления обычно

используются для задания списка значений (состояния объекта, типы ошибок).
Т.к. перечисления являются классами, то их возможности по сравнению с другими языками программирования значительно больше.
Перечисления могут иметь конструкторы, методы и поля.
Слайд 3

Перечисления РГРТУ, 2020 Перечисление обозначается ключевым словом enum. enum Apple {

Перечисления

РГРТУ, 2020

Перечисление обозначается ключевым словом enum.
enum Apple {
Jonathan, GoldenDel, RedDel,

Winesap, Cortland
}
Содержимое перечисления называется константами перечисления.
Не смотря на то, что перечисление является классом, при его инициализации использовать оператор new не надо.
Apple ap;
ap = Apple.RedDel;
См. annotations3
Слайд 4

Методы values() и valueOf() РГРТУ, 2020 Все перечисления по умолчанию содержат

Методы values() и valueOf()

РГРТУ, 2020

Все перечисления по умолчанию содержат 2 предопределённых

метода: values() и valueOf().
public static enum-type [] values()
public static enum-type valueOf(String str)
Метод values() возвращает массив, который содержит список констант перечисления.
ValueOf() возвращает значение перечисления, совпадающее с именем параметра.
См. Annotations4.
Слайд 5

Перечисление – это класс РГРТУ, 2020 Перечисление может иметь конструкторы, поля

Перечисление – это класс

РГРТУ, 2020

Перечисление может иметь конструкторы, поля и методы,

и даже реализовывать интерфейсы.
При определении конструктора для enum, он вызывается каждый раз при создании константы перечисления.
Перечисление не может содержать в себе другой класс.
Перечисление не может быть суперклассом.
См. Annotations5.
Слайд 6

Перечисления наследуются от Enum РГРТУ, 2020 При объявлении перечисления происходит автоматическое

Перечисления наследуются от Enum

РГРТУ, 2020

При объявлении перечисления происходит автоматическое наследование от

класса java.lang.Enum.
С помощью метода ordinal() можно получить значение порядкового номера, которое имеет константа перечисления.
for(Apple a: Apple.values())
System.out.println(a + “ ” + a.ordinal());
Для сравнения порядковых номеров двух констант одного перечисления используется метод compareTo().
If (ap.compareTo(ap2) < 0)
System.out.println(ap + “comes before ” + ap2);
Слайд 7

Пример перечисления РГРТУ, 2020 Смотри программу Annotation7.

Пример перечисления

РГРТУ, 2020

Смотри программу Annotation7.

Слайд 8

Класс wrapper (оболочка) РГРТУ, 2020 Примитивные типы (int, double) более производительны

Класс wrapper (оболочка)

РГРТУ, 2020

Примитивные типы (int, double) более производительны в вычислениях,

чем ссылочные.
Но нельзя использовать примитивный тип в качестве ссылки на метод.
В таких случаях Java использует классы-оболочки, которые являются классами, содержащими примитивные типы внутри объекта.
Оболочками являются Double, Float, Long, Integer, Short, Byte, Character, and Boolean.
Слайд 9

Character РГРТУ, 2020 Character - это оболочка вокруг типа char. Character(char

Character

РГРТУ, 2020

Character - это оболочка вокруг типа char.
Character(char ch)
Начиная с

JDK 9, Character является устаревшим.
Рекомендуется вместо него использовать статический метод valueOf().
static Character valueOf(char ch)
Для получения значения экземпляра объекта Character используют метод charValue().
char charValue()
Слайд 10

Boolean РГРТУ, 2020 Boolean – это оболочка вокруг boolean-значений. Boolean(boolean boolValue)

Boolean

РГРТУ, 2020

Boolean – это оболочка вокруг boolean-значений.
Boolean(boolean boolValue)
Boolean(String boolString)
Начиная с

JDK 9, Boolean является устаревшим.
Рекомендуется вместо него использовать статический метод valueOf().
static Boolean valueOf(boolean boolValue)
static Boolean valueOf(String boolString)
Для получения значения экземпляра объекта Boolean используют метод booleanValue():
boolean booleanValue()
Слайд 11

Оболочка числовых типов РГРТУ, 2020 Все оболочки числовых типов наследуются от

Оболочка числовых типов

РГРТУ, 2020

Все оболочки числовых типов наследуются от абстрактного класса

Number, который определяет методы, возвращающие значение объекта в каждом из числовых форматов.
byte byteValue()
double doubleValue()
float floatValue()
int intValue()
long longValue()
short shortValue()
Для получения экземпляра объекта оболочки рекомендуется использовать один из методов valueOf().
static Integer valueOf(int val)
static Integer valueOf(String valStr) throws NumberFormatException
Слайд 12

Автоупаковка РГРТУ, 2020 Автоупаковка - это процесс, при котором примитивный тип

Автоупаковка

РГРТУ, 2020

Автоупаковка - это процесс, при котором примитивный тип автоматически инкапсулируется

(упаковывается) в эквивалентный тип-оболочку.
Необходимость создавать экземпляр объекта явно отпадает.
Автораспаковка - это процесс, который значение запакованное в экземпляре объекта автоматически извлекает (распаковывает) из типа-оболочки.
Integer iOb = 100; // автоупаковка типа int
int i = iOb; // автораспаковка
Слайд 13

Автоупаковка и методы РГРТУ, 2020 Автоупаковка автоматически происходит, когда примитивный тип

Автоупаковка и методы

РГРТУ, 2020

Автоупаковка автоматически происходит, когда примитивный тип необходимо конвертировать

в экземпляр объекта.
Автораспаковка необходима, когда объект необходимо конвертировать в примитивный тип.
class Autobox {
static int m(Integer v) {
return v;
}
public static void main (String args[ ]) {
Integer iOb = m(100);
}
Слайд 14

Автоупаковка/распаковка в расширениях РГРТУ, 2020 Внутри расширения числовые объекты автоматически распаковываются.

Автоупаковка/распаковка в расширениях

РГРТУ, 2020

Внутри расширения числовые объекты автоматически распаковываются.
Integer iOb;
int i;
iOb

= 100;
++iOb; // происходит распаковка, вычисление
// и упаковка
Слайд 15

Автоупаковка/распаковка значений Boolean и Character РГРТУ, 2020 Boolean b = true;

Автоупаковка/распаковка значений Boolean и Character

РГРТУ, 2020

Boolean b = true;
if (b) System.out.println(“b

is true”);
Character ch = ‘x’;
char ch2 = ch;
Слайд 16

Автоупаковка/распаковка, помогает не допускать ошибки РГРТУ, 2020 // Ошибка при ручной

Автоупаковка/распаковка, помогает не допускать ошибки

РГРТУ, 2020

// Ошибка при ручной распаковке public class

Main { public static void main(String[] args) {
// Автоупаковка значения 1000 Integer iOb = 1000;
// Ручная распаковка в байт! int i = iOb.byteValue();
// Не покажет 1000 System.out.println(i); } }
Слайд 17

Предупреждение! РГРТУ, 2020 Из-за автоупаковки и автораспаковки возникает желание использовать исключительно

Предупреждение!

РГРТУ, 2020

Из-за автоупаковки и автораспаковки возникает желание использовать исключительно типы Integer

или Double, совершенно не используя примитивные типы.
Double a, b, c;
a = 10.0;
b = 4.0;
c = Math.sqrt(a*a + b*b);
System.out.println("Hypotenuse is " + c);
Данный код будет работать, но медленнее, чем с примитивными типами.
Слайд 18

Аннотации РГРТУ, 2020 Аннотация – специальная форма синтаксических метаданных, которая добавляется

Аннотации

РГРТУ, 2020

Аннотация – специальная форма синтаксических метаданных, которая добавляется в файлы

исходного кода и не изменяет выполнение программы.
Информация из аннотации может использоваться различными инструментальными средствами как при разработке, так и при развёртывании ПО.
Например, аннотации могут обрабатываться генератором исходного кода.
Термин метадата обозначает то же самое, но аннотация более объемлющий и распространённый.
Слайд 19

Аннотации РГРТУ, 2020 Аннотация создаётся через механизм, основанный на интерфейсе. @interface

Аннотации

РГРТУ, 2020

Аннотация создаётся через механизм, основанный на интерфейсе.
@interface MyAnno {
String

str();
int val();
}
Методы аннотаций действуют, как поля.
@MyAnno(str = "Annotation Example", val = 100)
public static void myMeth() { // ...
Аннотация не может наследоваться от класса.
Слайд 20

Политики удержания РГРТУ, 2020 Java определяет 3 политики удержания, которые находятся

Политики удержания

РГРТУ, 2020

Java определяет 3 политики удержания, которые находятся внутри перечисления

java.lang.annotation.RetentionPolicy: SOURCE, CLASS и RUNTIME.
Аннотация с политикой удержания SOURCE удерживается только в файле с исходным кодом и отбрасывается в ходе компиляции.
Аннотация с политикой удержания CLASS храниться файле .class в ходе компиляции.
Аннотация с политикой удержания RUNTIME храниться в файле .class в ходе компиляции доступна через JVM в ходе выполнения.
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno {
String str();
int val();
}
Слайд 21

Получение аннотаций во время выполнения с использованием рефлексии РГРТУ, 2020 Рефлексия

Получение аннотаций во время выполнения с использованием рефлексии

РГРТУ, 2020

Рефлексия - это

механизм получения информации о классе во время выполнения программы.
Одним из самых простых способов рефлексии класса является метод getClass(), определённый в Object.
class Meta {
@MyAnno(str = “Ann. example”, val = 100)
public static void myMeth() {
Meta ob = new Meta();
try {
Class c = ob.getClass();
Method m = c.getMethod(“myMeth”);

Слайд 22

Пример рефлексии РГРТУ, 2020 Смотри программу Annotation22.

Пример рефлексии

РГРТУ, 2020

Смотри программу Annotation22.

Слайд 23

Получение всех аннотаций РГРТУ, 2020 Для получения всех аннотаций, имеющих политику

Получение всех аннотаций

РГРТУ, 2020

Для получения всех аннотаций, имеющих политику удержания RUNTIME,

необходимо вызвать метод getAnnotations():
Annotation[] getAnnotations()
Пример:
try {
Annotation annots[] = ob.getClass().getAnnotations();

Method m = ob.getClass().getMethod(“myMeth”);
annots = m.getAnnotations();
Слайд 24

Интерфейс AnnotatedElement РГРТУ, 2020 Данный интерфейс поддерживает рефлексию для аннотаций и

Интерфейс AnnotatedElement

РГРТУ, 2020

Данный интерфейс поддерживает рефлексию для аннотаций и реализовывается в

классах Method, Field, Constructor, Class, и Package.
Метод getDeclaredAnnotations() возвращает массив всех не наследуемых аннотаций, представленных в вызываемом экземпляре класса.
Метод isAnnotationPresent() возвращает true если аннотация описана в вызываемом экземпляре объекта.
Слайд 25

Использование значений по умолчанию РГРТУ, 2020 Значение по умолчанию задаётся добавлением

Использование значений по умолчанию

РГРТУ, 2020

Значение по умолчанию задаётся добавлением оператора default

к объявлению поля или метода класса:
type member() default value;
Например:
@interface MyAnno {
String str() default “Testing”;
int val() default 9000;
}
Слайд 26

Маркер-аннотации РГРТУ, 2020 Маркер-аннотация - это специальный вид аннотаций, который ничего

Маркер-аннотации

РГРТУ, 2020

Маркер-аннотация - это специальный вид аннотаций, который ничего не содержит.
Данный

вид аннотаций служит для пометки части кода.
Например:
@MyMarker
public static void myMeth() {…}
Слайд 27

Аннотации с одним элементом РГРТУ, 2020 Они работают как обычные аннотации

Аннотации с одним элементом

РГРТУ, 2020

Они работают как обычные аннотации за исключением

того, что позволяют в краткой форме получить значение элемента.
В таких аннотациях не надо указывать имя присваиваемого значения.
Например:
@interface Mysingle {
int value();
}

@MySingle(100)
Слайд 28

Встроенные аннотации РГРТУ, 2020 Из пакета java.lang.annotation: @Retention, @Documented (это аннотация,

Встроенные аннотации

РГРТУ, 2020

Из пакета java.lang.annotation: @Retention, @Documented (это аннотация, подлежащая документированию),

@Target (указывает, для каких элементов применяется аннотация) и @Inherited (используется для указания суперклассов).
Из пакета java.lang: @Override, @Deprecated, @FunctionalInterface (это функциональный интерфейс, имеющий единственный абстрактный метод), @SafeVarargs (указывает на безопасность совершаемых действий) и @SuppressWarnings (подавляет вывод предупреждений).
Слайд 29

Аннотации типов РГРТУ, 2020 Аннотации могут применяться и к используемому типу.

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

РГРТУ, 2020

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

на необходимость проведения дополнительных проверок кода.
Аннотация типа должна включать цель ElementType.TYPE_USE.
void myMeth() throws @TypeAnno NullPointerException { // ...
int myMeth(@TypeAnno SomeClass this, int i, int j) { // ...