
- •Нововведения Java 5.0.
- •Цели занятия
- •Статический импорт
- •Автоупаковка / автораспаковка
- •Автоупаковка / автораспаковка
- •Автоупаковка / автораспаковка
- •Аргументы переменной длины
- •Аргументы переменной длины
- •Особенности переменного
- •Настраиваемые типы (generic)
- •Настраиваемые типы
- •Настраиваемые типы
- •Настраиваемые типы
- •Настраиваемые типы
- •Настраиваемые типы
- •Ограниченные типы
- •Ограниченные типы
- •Ограниченные типы
- •Ограниченные типы
- •Метасимвольный аргумент
- •Метасимвольный аргумент
- •Метасимвольный аргумент
- •Метасимвол с ограничениями
- •Настраиваемые методы
- •Настраиваемые методы
- •Настраиваемые методы
- •Настраиваемые методы
- •Настраиваемые методы
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ошибки неоднозначности
- •Улучшенный цикл for(For-each)
- •Работа улучшенного цикла for
- •Обработка многомерных
- •Вывод
- •Перечислимые типы
- •Перечислимые типы
- •Замечания:
- •Метаданные
- •Метаданные
- •Правила сохранения аннотаций
- •Правила сохранения аннотаций
- •Правила сохранения аннотаций
- •Аннотации-маркеры
- •Одночленные аннотации
- •Одночленные аннотации
- •Одночленные аннотации
- •Встроенные аннотации
- •Встроенные аннотации
- •Литература

Перечислимые типы
51• Можно проверить равенство двух констант перечислимого типа с помощью операции
отношения = =
if(ар = = Apple.GoldenDel) //
•Значение перечислимого типа можно использовать для управления оператором switch
switch(ap) {
case Jonathan: //...
case Winsap: //...
default: //...
}
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Перечислимые типы
52• Во все перечислимые типы автоматически включены два метода: values() и vaiueOf()
•public static enumType[] values()
возвращает ссылку на массив ссылок на все константы перечислимого типа
Apple[] allApples = Apple.values();
• public static enumType valueOf(String str)
возвращает константу перечислимого типа, имя которой соответствует указанной строке, иначе выбрасывает исключение
Apple ap = Apple.valueOf(“Jonathan”);
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

|
|
Замечания: |
53 |
• |
Перечислимый тип в языке Java — это класс |
|
||
|
• |
Несмотря на то, что вы не можете инициализировать |
|
|
переменную типа enum с помощью операции new, у |
|
|
перечислимого типа много функциональных |
|
|
возможностей таких же, как у других классов |
|
• |
К примеру, вы можете создать для него конструкторы, |
|
|
добавить поля и методы и даже реализовать интерфейсы |
|
• |
Конструктор вызывается отдельно для каждой константы |
|
• |
Перечислимый тип не может наследовать другой класс, |
|
|
но все перечислимые типы автоматически наследуют от |
|
|
класса java.lang.Enum |
|
• |
Тип enum не может быть суперклассом (не может |
|
|
расширяться) |
|
• |
Клонировать экземпляры перечиcлимых типов нельзя, |
|
|
сравнивать и выполнять прочие стандартные операции – |
|
|
можно |
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Замечания:
54 Пример 14
enum Apple {
Jonathan(10), GoldenDel(9), RedDel, Winsap(15), Cortland(8);
private int price; Apple(int p) {
price = p;
}
Apple() { price = -1;
}
int getPrice() { return price;
}
}
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Метаданные
55• В основе механизма метаданных лежат так называемые аннотации
•Аннотация – это «интерфейс» специфического вида, позволяющий задавать описания классов и их элементов
@interface MyAnnotation { String str();
int val();
}
•Члены-методы имеют, скорее, смысл полей
•Тела этих методов будут создаваться автоматически Java
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Метаданные
56• Аннотациями можно снабжать классы, методы, поля, параметры, константы перечислимых
типов и аннотации
•В любом случае аннотация предшествует объявлению
•Все аннотации наследуют интерфейс java.lang.annotation.Annotation
@MyAnnotation(str = “Example”, val= 100) public static void myMeth() {...}
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Правила сохранения аннотаций
57• Правила сохранения аннотаций определяют, в какой момент аннотации будут уничтожены
•В языке Java описаны три таких правила — SOURCE, CLASS И RUNTIME, включенные в перечислимый тип java.lang.annotation.RetentionPolicy
•SOURCE – аннотация, заданная с правилом сохранения SOURCE, существует только в исходном тексте программы и отбрасывается во время компиляции
•CLASS – аннотация, заданная с правилом сохранения class, помещается в файл .class в процессе компиляции. Но она не доступна в JVM во время выполнения
•RUNTIME – аннотация, заданная с правилом сохранения runtime, помещается в файл .class в процессе компиляции и доступна в JVM во время выполнения.
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Правила сохранения аннотаций
58• Правило RUNTIME предлагает максимальную продолжительность существования аннотации
•Правило сохранения для аннотации задается с помощью одной из встроенных аннотаций @Retention
@Retention (retention-policy)
•В этой записи retention-policy задается одной из описанных ранее констант перечислимого типа
•Если для аннотации не задано правило сохранения, по умолчанию задается правило
CLASS
@Retention(RetentionPolicy.RUNTIME)
@interface myAnnotation { String str(); int val(); }
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Правила сохранения аннотаций
59• Получение информации об аннотациях производится средствами рефлексии
•Вы можете получить конкретную аннотацию, связанную с объектом, с помощью вызова метода getAnnotation() или использовать метод getAnnotations() для получения массива всех аннотаций
•Методы getAnnotation() и getAnnotations(), определены в новом интерфейсе
AnnotatedElement, который включен в пакет java.lang.reflect
•Этот интерфейс поддерживает рефлексию для аннотаций и реализован в классах Method,
Field, Сonstructor, Сlass и Package
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

|
|
Использование значений по |
60 |
|
умолчанию |
|
• |
Вы можете передавать значения по умолчанию методам- |
|
|
членам аннотаций, которые будут использоваться, если не |
|
|
задано значение при вставке аннотации |
|
• |
Значение по умолчанию указывается с помощью |
|
|
ключевого слова default в объявлении метода-члена |
|
|
type member() default value; |
|
• |
Значение value должно иметь тип, совместимый с типом |
|
|
type |
@Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation {
String str() default “Testing”; int val() default 9000; }
@MyAnnotation() @MyAnnotation(str = “some string”); @MyAnnotation(val = 100);
@MyAnnotation(str = “Testing”, val = 100);
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |