Новые возможности Java 5 Java Advanced
2Georgiy KorneevJava Advanced / Новые возможности Java 5 Краткое содержание 1.Что такое generic 2.Реализация Generic 3.Смешение generic и не generic-кода 4.Autoboxing 5.Расширенный for 6.Varargs и format 7.Static Import 8.Перечисления 9.Заключение
Что такое generic Часть 1
4Georgiy KorneevJava Advanced / Новые возможности Java 5 Что такое Generic Generic параметризация класса времени компиляции Совместимость типов проверяется при компиляции Во время исполнения информация о фактическом типе отсутствует Единая реализация Template – параметризация класса времени исполнения
5Georgiy KorneevJava Advanced / Новые возможности Java 5 Generics и коллекции Коллекции, множетсва, списки, … параметризуются типом элемента Collection Set List … Отображения параметризуются типами ключа и значения Map SortedMap …
6Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример определения generic-класса public interface List extends Collection { E get(int i); set(int i, E e); add(E e); Iterator iterator();... }
7Georgiy 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);
8Georgiy 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)); }
9Georgiy 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]; }... }
10Georgiy KorneevJava Advanced / Новые возможности Java 5 Несовместимость generic-типов Generic-типы не совместимы по присваиванию List li = new ArrayList (); List lo = li; Иначе ошибки lo.add(hello); Integer li = lo.get(0); // ClassCastException
11Georgiy KorneevJava Advanced / Новые возможности Java 5 Проверка типов времени исполнения Класс Collections List checkedList(List, S.class) checkedCollection checkedMap …
Реализация Generic Часть 2
13Georgiy 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);
14Georgiy 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);
15Georgiy 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);
16Georgiy 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);
17Georgiy KorneevJava Advanced / Новые возможности Java 5 Проблема 3 Метод void addAll(Object[] a, Collection c) { for (int i = 0; i < a.length; i++) { c.add(a[i]); }
18Georgiy 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 ());
19Georgiy 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 ());
20Georgiy 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 ());
21Georgiy 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 ());
22Georgiy 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);
23Georgiy 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);
24Georgiy KorneevJava Advanced / Новые возможности Java 5 Ограничения Generic Невозможно создать массив параметра типа Collection c; T[] ta; new T[10]; Невозможно создать массив Generic- классов new ArrayList >(); List [] la = new List [10];
Смешение generic и не-generic кода Часть 3
26Georgiy KorneevJava Advanced / Новые возможности Java 5 Generic – один класс Примеры List ls; List li; ls.getClass() == li.getClass() // True ls instanceof List // True ls instanceof List
27Georgiy 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; }
28Georgiy 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; }
29Georgiy KorneevJava Advanced / Новые возможности Java 5 Преобразование типов Уничтожение информации о типе List l = new ArrayList (); Добавление информации о типе List l = (List ) new ArrayList(); List l1 = new ArrayList(); Unchecked warning
Autoboxing Часть 4
31Georgiy KorneevJava Advanced / Новые возможности Java 5 Примитивные типы и обертки Примитивный типТип-обертка booleanBoolean byteByte shortShort charCharacter intInteger longLong floatFloat doubleDouble voidVoid
32Georgiy KorneevJava Advanced / Новые возможности Java 5 Boxing и Unboxing Boxing – заключение значения примитивного типа в обертку int a = …; new Integer(a) Unboxing – извлечение значения примитивного типа из обертки Integer a = …; a.intValue()
33Georgiy KorneevJava Advanced / Новые возможности Java 5 Autoboxing Генерация кода для boxing и unboxing при необходимости Явное приведение типов (Integer) 10 (int) new Integer(10) (Object) 10 Приведение типов по ходу
34Georgiy 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());
35Georgiy 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); }
36Georgiy KorneevJava Advanced / Новые возможности Java 5 Особенности Autoboxing Обработка null при unboxing NullPointerException Сравнение на равенство (==) Примитивные типы сравниваются по значению Обертки сравниваются по ссылке Снижение производительности
Расширенный цикл for Часть 5
38Georgiy 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; }
39Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример. Сумма чисел в коллекции (2) Новый вариант (проверка на null) int sum = 0; for (Integer j : c) { if (j != null) { sum += j; }
40Georgiy 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; }
41Georgiy 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; }
42Georgiy 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); }
43Georgiy KorneevJava Advanced / Новые возможности Java 5 Интерфейс Iterable Позволяет использовать новый for public interface Iterable { Iterator iterator(); } Реализуется стандартными коллекциями
Varargs и format Часть 6
45Georgiy KorneevJava Advanced / Новые возможности Java 5 Varargs Механизм создания методов, принимающих переменное число параметров
46Georgiy 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)
47Georgiy KorneevJava Advanced / Новые возможности Java 5 Определение метода Метод format format(String pattern, Object… arguments) Общий случай Последний аргумент может быть объявлен в виде T … Реальный тип аргумента T[] Может передаваться либо массив, либо переменное число аргументов
48Georgiy 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})
49Georgiy KorneevJava Advanced / Новые возможности Java 5 Интерфейс Formattable Аналог метода toString() для класса Formattable (%s) Определение интерфейса interface Formattable { void formatTo( Formatter formatter, // куда выводить int flags, // как выводить int width, // мин. ширина поля int precision// макс. ширина поля ) }
Static Import Часть 7
51Georgiy KorneevJava Advanced / Новые возможности Java 5 Импортирование статических членов Импортирование поля import static java.lang.Math.PI; … angle = PI / 2 Импортирования метода import static java.lang.Math.cos; … cos(angle)
52Georgiy KorneevJava Advanced / Новые возможности Java 5 Применение Static Import При многократном доступе к статическим полям или методам других классов Для методоыв импортируются все перегруженные версии Широкое применение Static Import снижает читаемость кода
Перечисления Часть 8
54Georgiy 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; Проблемы Нет проверки типов Нет проверки уникальности Плохая расширяемость Малая информативность
55Georgiy KorneevJava Advanced / Новые возможности Java 5 Перечислимый тип Пример public enum State { NEW, RUNNING, BLOCKED, FINISHED } Каждое перечисление является независимой областью видимости
56Georgiy KorneevJava Advanced / Новые возможности Java 5 Идентификация переменных Классом Экземпляром Именем Номером Имя Идентификатор экземпляра Метод name() Номер Может быть передан в конструктор экземпляра Метод ordinal()
57Georgiy KorneevJava Advanced / Новые возможности Java 5 Перечисления как классы Перечисление может иметь Закрытые конструкторы Поля Методы Абстрактные методы, если они определены в каждом экземпляре Перечисление может реализовывать интерфейсы
58Georgiy 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; }
59Georgiy 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); }
60Georgiy KorneevJava Advanced / Новые возможности Java 5 Пример. Операции (2) double apply(Operation op, double x, double y) { return op.eval(x, y); }
61Georgiy KorneevJava Advanced / Новые возможности Java 5 Методы работы с перечислениями Класс Enum – базовый для перечислений name() – имя ordinal() – номер valueOf(Class, name) – экземпляр по номеру Дополнительные values() – все экземпляры valueOf(name) – экземпляр по имени
62Georgiy 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 )); }
63Georgiy 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)
64Georgiy KorneevJava Advanced / Новые возможности Java 5 Класс EnumMap Отображение из перечисления Храниться в массиве Создание EnumMap EnumMap (K.class) EnumMap (EnumMap ) EnumMap (Map )
Заключение Часть 9
66Georgiy KorneevJava Advanced / Новые возможности Java 5 Ссылки (1) Generics Tutorial // tutorial.pdf tutorial.pdf JSR 14 (Generics) // Autoboxing // nguage/autoboxing.html nguage/autoboxing.html JSR 201 (Autoboxing) //
67Georgiy 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
68Georgiy KorneevJava Advanced / Новые возможности Java 5 Ссылки (3) Interfaces (JLS) // n/html/interfaces.html n/html/interfaces.html
69Georgiy KorneevJava Advanced / Новые возможности Java 5 Вопросы