Новые возможности Java 5 Java Advanced
2Georgiy KorneevJava Advanced / Новые возможности Java 5 Краткое содержание 1.Generics 2.Реализация Generics 3.Generics и вариантность 4.Смешение generic и не generic-кода 5.Autoboxing 6.Расширенный for 7.Varargs и format 8.Static import 9.Перечисления 10.Заключение
3Georgiy KorneevJava Advanced / Новые возможности Java 5 Версии Java Java Language Specification First Edition – 1.1 Second Edition – 1.4 Third Edition Java Virtual Machine Specification First Edition – 1.1 Second Edition
Generics Часть 1
5Georgiy KorneevJava Advanced / Новые возможности Java 5 Полиморфизм Один код – разное поведение Ad-hoc Перегрузка Автоматизированное приведение типов Универсальный Параметрический Включения
6Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример полиморфизма (1) Операция сложения (+) Примеры использования Перегрузка времени компиляции по обоим параметрам Перегрузка для разных типов + автоматизированное приведение типов
7Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример полиморфизма (2) Функция printf Примеры использования printf("%d", 10); printf("%s", "hello"); Перегрузка времени исполнения по всем параметрам, кроме первого + явная передача информации о типах
8Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример полиморфизма (3) Наследование в ООП Пример использования drawWithColor(Shape shape, Color color) { shape.setColor(color); shape.draw() } drawWithColor – полиморфизм включения по первому параметру draw(this) – перегрузка времени исполнения по первому параметру
9Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример полиморфизма (4) Определение типа во время исполнения Пример использования void draw(Shape shape) { if (shape instanceof Rect) … if (shape instanceof Circle) … } draw() – перегрузка времени исполнения
10Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример полиморфизма (5) Шаблоны в С++ Пример использования template bool contains(T x, T a[], int size) { for(int i = 0; i < size; i++) if (x == a[i]) return true; return false; } Перегрузка времени компиляции по всем параметрам
11Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример полиморфизма (6) Generics в Java Пример использования boolean contains(T item, T[] array) { for(int i = 0; i < array.length; i++) if (item.equals(array[i])) return true; return false; } Параметрический полиморфизм по T
12Georgiy KorneevJava Advanced / Новые возможности Java 5 Особенности Generics Строгая типизация Единая реализация Отсутствие информации о типе
13Georgiy KorneevJava Advanced / Новые возможности Java 5 Generic коллекции Коллекции, множества, списки, … параметризуются типом элемента Collection Set List … Отображения параметризуются типами ключа и значения Map SortedMap …
14Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример определения generic-класса public interface List extends Collection { E get(int i); set(int i, E e); add(E e); Iterator iterator();... }
15Georgiy KorneevJava Advanced / Новые возможности Java 5 Generic List List список элементов E Раньше List list = new List(); list.add(new Integer(1)); Integer i = (Integer) list.get(0); Теперь List list = new List (); list.add(new Integer(1)); Integer i = list.get(0);
16Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример. Подсчет количества слов Map map = new TreeMap (); for (Iterator i = c.iterator(); i.hasNext(); ) { String word = i.next(); Integer count = map.get(word); int value = (count == null) ? 0 : count.intValue(); map.put(word, new Integer(value + 1)); }
17Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример реализации generic-класса public class AL implements List { private E[] elements; public AL() { elements = (E[]) new Object[10]; } public E get(int i) { return elements[i]; }... }
18Georgiy KorneevJava Advanced / Новые возможности Java 5 Несовместимость generic-типов Generic-типы не совместимы по присваиванию List li = new ArrayList (); List lo = li; Иначе ошибки lo.add(hello); Integer li = lo.get(0); // ClassCastException
19Georgiy KorneevJava Advanced / Новые возможности Java 5 Проверка типов времени исполнения Класс Collections List checkedList(List, S.class) checkedCollection checkedMap …
Реализация Generic Часть 2
21Georgiy KorneevJava Advanced / Новые возможности Java 5 Проблема 1 Метод void dump(Collection c) { for (Iterator i = c.iterator(); i.hasNext(); ) { Object o = i.next(); System.out.println(o); } Вызовы List l; dump(l);
22Georgiy KorneevJava Advanced / Новые возможности Java 5 Решение 1 – wildcard Метод void dump(Collection c) { for (Iterator i = c.iterator(); i.hasNext(); ) { Object o = i.next(); System.out.println(o); } Вызовы List l; dump(l);
23Georgiy KorneevJava Advanced / Новые возможности Java 5 Проблема 2 Метод void draw(List c) { for (Iterator i = c.iterator(); i.hasNext(); ) { Shape s = i.next(); s.draw(); } Вызовы List l; draw(l);
24Georgiy KorneevJava Advanced / Новые возможности Java 5 Решение 2 – bounded wildcard Метод void draw(List c) { for (Iterator i = c.iterator(); i.hasNext(); ) { Shape s = i.next(); s.draw(); } Вызовы List l; draw(l);
25Georgiy KorneevJava Advanced / Новые возможности Java 5 Проблема 3 Метод void addAll(Object[] a, Collection c) { for (int i = 0; i < a.length; i++) { c.add(a[i]); }
26Georgiy KorneevJava Advanced / Новые возможности Java 5 Решение 3 – generic-метод Метод void addAll(T[] a, Collection c) { for (int i = 0; i < a.length; i++) { c.add(a[i]); } Примеры использования addAll(new String[10], new ArrayList ()); addAll(new Object[10], new ArrayList ()); addAll(new String[10], new ArrayList ()); addAll(new Object[10], new ArrayList ());
27Georgiy KorneevJava Advanced / Новые возможности Java 5 Проблема 4 Метод void addAll(Collection c, Collection c2) { for (Iterator i = c.iterator(); i.hasNext(); ) { T o = i.next(); c2.add(o); } Примеры использования addAll(new AL (), new AL ());
28Georgiy KorneevJava Advanced / Новые возможности Java 5 Решение 4 – bounded type argument Метод void addAll(Collection c, Collection c2) { for (Iterator i = c.iterator(); i.hasNext(); ) { S o = i.next(); c2.add(o); } Примеры использования addAll(new AL (), new AL ());
29Georgiy KorneevJava Advanced / Новые возможности Java 5 Решение 4 – bounded wildcard Метод void addAll(Collection c, Collection c2) { for (Iterator i = c.iterator(); i.hasNext(); ) { T o = i.next(); c2.add(o); } Примеры использования addAll(new AL (), new AL ());
30Georgiy KorneevJava Advanced / Новые возможности Java 5 Проблема 5 Метод > T max(Collection c) { } Пример использования List il; Integer I = max(il); class Test implements Comparable {…} List tl; Test t = max(tl);
31Georgiy KorneevJava Advanced / Новые возможности Java 5 Решение 5 – upper bounded wcard Метод > max(Collection c) { … } Пример использования List il; Integer I = max(il); class Test implements Comparable {…} List tl; Test t = max(tl);
32Georgiy KorneevJava Advanced / Новые возможности Java 5 Ограничения Generic Невозможно создать массив параметра типа Collection c; T[] ta; new T[10]; Невозможно создать массив Generic- классов new ArrayList >(); List [] la = new List [10];
Generics и вариантность Часть 3
34Georgiy KorneevJava Advanced / Новые возможности Java 5 Вариантность Ковариантность Согласованность с отношением включения Контрвариантность Несогласованность с отношением включения Инвариантность Независимость от отношения включения
35Georgiy KorneevJava Advanced / Новые возможности Java 5 Вариантность функторов (1) Функтор interface Functor { R apply(A argument); } Совместимость по присваиванию (не Java) Functor f1; Functor f2 = f1; Что можно сказать о R1, R2 и A1, A2
36Georgiy KorneevJava Advanced / Новые возможности Java 5 Вариантность функторов (2) Ковариантность результата Контрвариантность аргумента Приведение типов для функторов Functor as(Functor f) { return new Functor { R apply(A argument) { return f(argument); }
37Georgiy KorneevJava Advanced / Новые возможности Java 5 Правило Источник extends Приемник super Источник и приемник Инвариантный
38Georgiy KorneevJava Advanced / Новые возможности Java 5 Wildcard Capture (1) void swap(List list, int i, int j) { // ? }
39Georgiy KorneevJava Advanced / Новые возможности Java 5 Wildcard Capture (2) void swap(List list, int i, int j) { swapImpl(list, i, j); }
40Georgiy KorneevJava Advanced / Новые возможности Java 5 Wildcard Capture (3) void swap(List list, int i, int j) { swapImpl(list, i, j); } void swapImpl(List list, int i, int j) { T temp = list.get(i); list.set(i, list.get(j)); list.set(j, temp); }
Смешение generic и не-generic кода Часть 4
42Georgiy KorneevJava Advanced / Новые возможности Java 5 Generic – один класс Примеры List ls; List li; ls.getClass() == li.getClass() // True ls instanceof List // True ls instanceof List
43Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример кода Collection c; Iterator i = c.iterator(); Integer max = i.next(); while(i.hasNext()) { Integer next = i.next(); if (next.compareTo(result) > 0) { max = next; }
44Georgiy KorneevJava Advanced / Новые возможности Java 5 Код без generic Collection c; Iterator i = c.iterator(); Integer max = (Integer) i.next(); while(i.hasNext()) { Integer next = (Integer) i.next(); if (next.compareTo(result) > 0) { max = next; }
45Georgiy KorneevJava Advanced / Новые возможности Java 5 Преобразование типов Уничтожение информации о типе List l = new ArrayList (); Добавление информации о типе List l = (List ) new ArrayList(); List l1 = new ArrayList(); Unchecked warning
Autoboxing Часть 5
47Georgiy KorneevJava Advanced / Новые возможности Java 5 Примитивные типы и обертки Примитивный типТип-обертка booleanBoolean byteByte shortShort charCharacter intInteger longLong floatFloat doubleDouble voidVoid
48Georgiy KorneevJava Advanced / Новые возможности Java 5 Boxing и Unboxing Boxing – заключение значения примитивного типа в обертку int a = …; new Integer(a) Unboxing – извлечение значения примитивного типа из обертки Integer a = …; a.intValue()
49Georgiy KorneevJava Advanced / Новые возможности Java 5 Autoboxing Генерация кода для boxing и unboxing при необходимости Явное приведение типов (Integer) 10 (int) new Integer(10) (Object) 10 Приведение типов по ходу
50Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример Исходный код Integer i1 = 1; Integer i2 = 2; Integer i3 = i1 + i2; Сгенерированный код Integer i1 = Integer.valueOf(1); Integer i2 = Integer.valueOf(2); Integer i3 = Integer.valueOf(i1.intValue() + i2.intValue());
51Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример. Подсчет количеств слов Map map = new TreeMap (); for (Iterator i = c.iterator(); i.hasNext(); ) { String word = i.next(); Integer count = map.get(word); m.put(word, (count == null) ? 1 : count + 1); }
52Georgiy KorneevJava Advanced / Новые возможности Java 5 Особенности Autoboxing Обработка null при unboxing NullPointerException Сравнение на равенство (==) Примитивные типы сравниваются по значению Обертки сравниваются по ссылке Снижение производительности
Расширенный цикл for Часть 6
54Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример. Сумма чисел в коллекции (1) Старый вариант (проверка на null) int sum = 0; for (Iterator i = c.iterator(); i.hasNext(); ) { Integer j = i.next(); if (j != null) { sum += j; }
55Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример. Сумма чисел в коллекции (2) Новый вариант (проверка на null) int sum = 0; for (Integer j : c) { if (j != null) { sum += j; }
56Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример. Сумма чисел в коллекции (3) Старый вариант int sum = 0; for (Iterator i = c.iterator(); i.hasNext(); ) { sum += i.next(); } Новый вариант int sum = 0; for (int j : c) { sum += j; }
57Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример. Минимум в массиве Старый вариант int min = Integer.MAX_VALUE; for (int i = 0; i < a.length; i++) { if (min > a[i]) min = a[i]; } Новый вариант int min = Integer.MAX_VALUE; for (int i : a) { if (min > i) min = i; }
58Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример. Подсчет количеств слов Map map = new TreeMap (); for (String word : c) { Integer count = map.get(word); m.put(word, (count == null) ? 1 : count + 1); }
59Georgiy KorneevJava Advanced / Новые возможности Java 5 Интерфейс Iterable Позволяет использовать новый for public interface Iterable { Iterator iterator(); } Реализуется стандартными коллекциями
Varargs и format Часть 7
61Georgiy KorneevJava Advanced / Новые возможности Java 5 Varargs Механизм создания методов, принимающих переменное число параметров
62Georgiy KorneevJava Advanced / Новые возможности Java 5 Методы.format Позволяют форматировать строки аналогично функции printf Классы Formatter String PrintWriter Пример String.format("(%d, %d)--(%d, %.3f)", 1, 1, 2, 0.5) System.out.format(Hello %s ", userName)
63Georgiy KorneevJava Advanced / Новые возможности Java 5 Определение метода Метод format format(String pattern, Object… arguments) Общий случай Последний аргумент может быть объявлен в виде T … Реальный тип аргумента T[] Может передаваться либо массив, либо переменное число аргументов
64Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример. Нахождение минимума Пример метода public static int min(int... a) { int min = Integer.MAX_VALUE; for (int i : a) { if (min > i) min = i; } return min; } Примеры использования min(3) min(1, 2, 3, -1, -2, -3) min(new int[]{1, 2, 3, -1, -2, -3})
65Georgiy KorneevJava Advanced / Новые возможности Java 5 Интерфейс Formattable Аналог метода toString() для класса Formattable (%s) Определение интерфейса interface Formattable { void formatTo( Formatter formatter, // куда выводить int flags, // как выводить int width, // мин. ширина поля int precision// макс. ширина поля ) }
Static Import Часть 8
67Georgiy KorneevJava Advanced / Новые возможности Java 5 Импортирование статических членов Импортирование поля import static java.lang.Math.PI; … angle = PI / 2 Импортирования метода import static java.lang.Math.cos; … cos(angle)
68Georgiy KorneevJava Advanced / Новые возможности Java 5 Применение Static Import При многократном доступе к статическим полям или методам других классов Для методов импортируются все перегруженные версии Широкое применение Static Import снижает читаемость кода
Перечисления Часть 9
70Georgiy KorneevJava Advanced / Новые возможности Java 5 Как было раньше Пример public final static int NEW = 1; public final static int RUNNING = 2; public final static int BLOCKED = 3; public final static int FINISHED = 4; Проблемы Нет проверки типов Нет проверки уникальности Плохая расширяемость Малая информативность
71Georgiy KorneevJava Advanced / Новые возможности Java 5 Перечислимый тип Пример public enum State { NEW, RUNNING, BLOCKED, FINISHED } Каждое перечисление является независимой областью видимости
72Georgiy KorneevJava Advanced / Новые возможности Java 5 Идентификация переменных Классом Экземпляром Именем Номером Имя Идентификатор экземпляра Метод name() Номер Может быть передан в конструктор экземпляра Метод ordinal()
73Georgiy KorneevJava Advanced / Новые возможности Java 5 Перечисления как классы Перечисление может иметь Закрытые конструкторы Поля Методы Абстрактные методы, если они определены в каждом экземпляре Перечисление может реализовывать интерфейсы
74Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример. Меры длины (1) public enum Unit { KILOMETER(1e3), METER(1), MILLIMETER(1e-3); private final double length; private Unit(double length) { this.length = length; } public double getLength() { return length; }
75Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример. Операции (1) public enum Operation { PLUS { double eval(double x, double y) { return x + y; } }, MINUS { double eval(double x, double y) { return x - y; } }, TIMES { double eval(double x, double y) { return x * y; } }, DIVIDE { double eval(double x, double y) { return x / y; } }; abstract double eval(double x, double y); }
76Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример. Операции (2) double apply(Operation op, double x, double y) { return op.eval(x, y); }
77Georgiy KorneevJava Advanced / Новые возможности Java 5 Методы работы с перечислениями Класс Enum – базовый для перечислений name() – имя ordinal() – номер valueOf(Class, name) – экземпляр по номеру Дополнительные values() – все экземпляры valueOf(name) – экземпляр по имени
78Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример. Меры длины (2) Вывод соотношений мер длины for (Unit u1 : Unit.values()) { for (Unit u2 : Unit.values()) { System.out.println(String.format( "There are %f %sS in one %s", u2.getLength()/u1.getLength(), u1, u2 )); }
79Georgiy KorneevJava Advanced / Новые возможности Java 5 Класс EnumSet Множество экземпляров перечисления Храниться побитно Создание EnumSet EnumSet EnumSet.noneOf(T.class) EnumSet EnumSet.allOf(T.class) EnumSet EnumSet.of(e1, e2, …) EnumSet EnumSet.copyOf(EnumSet s) EnumSet EnumSet.copyOf(Collection t) EnumSet EnumSet.complementOf(EnumSet s)
80Georgiy KorneevJava Advanced / Новые возможности Java 5 Класс EnumMap Отображение из перечисления Храниться в массиве Создание EnumMap EnumMap (K.class) EnumMap (EnumMap ) EnumMap (Map )
Заключение Часть 10
82Georgiy KorneevJava Advanced / Новые возможности Java 5 Ссылки (1) Generics Tutorial // tutorial.pdf tutorial.pdf JSR 14 (Generics) // Autoboxing // nguage/autoboxing.html nguage/autoboxing.html JSR 201 (Autoboxing) //
83Georgiy KorneevJava Advanced / Новые возможности Java 5 Ссылки (2) New Java Language Fatures // eatures.html#lang eatures.html#lang Enums (JLS) // n/html/classes.html#8.9 n/html/classes.html#8.9 Import Declarations (JLS) // n/html/packages.html#7.5 n/html/packages.html#7.5
84Georgiy KorneevJava Advanced / Новые возможности Java 5 Ссылки (3) Interfaces (JLS) // n/html/interfaces.html n/html/interfaces.html
85Georgiy KorneevJava Advanced / Новые возможности Java 5 Вопросы