Новые возможности Java 5 Java Advanced. 2Georgiy KorneevJava Advanced / Новые возможности Java 5 Краткое содержание 1.Generics 2.Реализация Generics 3.Generics.

Презентация:



Advertisements
Похожие презентации
Новые возможности Java 5 Java Advanced. 2Georgiy KorneevJava Advanced / Новые возможности Java 5 Краткое содержание 1.Что такое generic 2.Реализация Generic.
Advertisements

Новые возможности Java 5 Java Advanced. 2Georgiy KorneevJava Advanced / Новые возможности Java 5 Содержание Перечисления Метаданные Другие возможности.
1Georgiy KorneevJava Advanced / Новые возможности Java 5 Проблема 1 Метод void dump(Collection c) { for (Iterator i = c.iterator(); i.hasNext(); ) { Object.
Лекция 2 Раздел 2.1 Windows Phone Темы раздела 3.
Таблица умножения на 8. Разработан: Бычкуновой О.В. г.Красноярск год.
Перегрузка операторов x = a + b результат 1-й операнд2-й операнд оператор По количеству операндов операторы делятся на: унарные (один операнд) бинарные.
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
САОД кафедра ОСУ 1 Основные абстрактные типы данных Схема процесса создания программ для решения прикладных задач ВУ.

Фрагмент карты градостроительного зонирования территории города Новосибирска Масштаб 1 : 6000 Приложение 7 к решению Совета депутатов города Новосибирска.
Матемтааки ЕТ СТ 2 класс Шипилова Наталия Викторовна учитель начальных классов, ВКК Шипилова Наталия Викторовна учитель начальных классов, ВКК.
1 Знаток математики Тренажер Таблица умножения 2 класс Школа 21 века ®м®м.
1. Определить последовательность проезда перекрестка
Фрагмент карты градостроительного зонирования территории города Новосибирска Масштаб 1 : 4500 к решению Совета депутатов города Новосибирска от
Отделение ПФР по Тамбовской области Проведение кампании по повышению пенсионной грамотности молодежи в Тамбовской области в 2011 году 8 февраля 2012 г.
Масштаб 1 : Приложение 1 к решению Совета депутатов города Новосибирска от _____________ ______.
Масштаб 1 : Приложение 1 к решению Совета депутатов города Новосибирска от
Урок повторения по теме: «Сила». Задание 1 Задание 2.
ЦИФРЫ ОДИН 11 ДВА 2 ТРИ 3 ЧЕТЫРЕ 4 ПЯТЬ 5 ШЕСТЬ 6.
1 Знаток математики Тренажер Таблица умножения 3 класс Школа России Масько Любовь Георгиевна Муниципальное общеобразовательное учреждение средняя общеобразовательная.
Транксрипт:

Новые возможности 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 Вопросы