1 / 69

Новые возможности Java 5

Новые возможности Java 5. Java Advanced. Краткое содержание. Что такое generic Реализация Generic Смешение generic и не generic- кода Autoboxing Расширенный for Varargs и format Static Import Перечисления Заключение. Часть 1. Что такое generic. Что такое Generic.

raoul
Download Presentation

Новые возможности Java 5

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Новые возможности Java 5 Java Advanced

  2. Краткое содержание • Что такое generic • Реализация Generic • Смешение generic и не generic-кода • Autoboxing • Расширенный for • Varargs и format • Static Import • Перечисления • Заключение Java Advanced / Новые возможности Java 5

  3. Часть 1 Что такое generic

  4. Что такое Generic • Generic ─ параметризация класса времени компиляции • Совместимость типов проверяется при компиляции • Во время исполнения информация о фактическом типе отсутствует • Единая реализация • Template – параметризация класса времени исполнения Java Advanced / Новые возможности Java 5

  5. Generics и коллекции • Коллекции, множетсва, списки, … параметризуются типом элемента • Collection<E> • Set<E> • List<E> • … • Отображения параметризуются типами ключа и значения • Map<K, V> • SortedMap<K, V> • … Java Advanced / Новые возможности Java 5

  6. Пример определения generic-класса public interface List<E> extends Collection<E> { E get(int i); set(int i, E e); add(E e); Iterator<E> iterator(); ... } Java Advanced / Новые возможности Java 5

  7. Generic List • List<E>─ список элементов E • Раньше List list = new List(); list.add(new Integer(1)); Integer i = (Integer) list.get(0); • Теперь List<Integer> list = new List<Integer>(); list.add(new Integer(1)); Integer i = list.get(0); Java Advanced / Новые возможности Java 5

  8. Пример. Подсчет количества слов Map<String, Integer> map = new TreeMap<String, Integer>(); for (Iterator<String> 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)); } Java Advanced / Новые возможности Java 5

  9. Пример реализации generic-класса public class AL<E> implements List<E> { private E[] elements; public AL() { elements = (E[]) new Object[10]; } public E get(int i) { return elements[i]; } ... } Java Advanced / Новые возможности Java 5

  10. Несовместимость generic-типов • Generic-типы не совместимы по присваиванию List<Integer> li = new ArrayList<Integer>(); List<Object> lo = li; • Иначе — ошибки lo.add(“hello”); Integer li = lo.get(0); // ClassCastException Java Advanced / Новые возможности Java 5

  11. Проверка типов времени исполнения • Класс Collections • List<S> checkedList(List<S>, S.class) • checkedCollection • checkedMap • … Java Advanced / Новые возможности Java 5

  12. Часть 2 Реализация Generic

  13. Проблема 1 • Метод void dump(Collection<Object> c) { for (Iterator<Object> i = c.iterator(); i.hasNext(); ) { Object o = i.next(); System.out.println(o); } } • Вызовы • List<Object> l; dump(l); • List<Integer> l; dump(l); Java Advanced / Новые возможности Java 5

  14. Решение 1 – wildcard • Метод void dump(Collection<?> c) { for (Iterator<?> i = c.iterator(); i.hasNext(); ) { Object o = i.next(); System.out.println(o); } } • Вызовы • List<Object> l; dump(l); • List<Integer> l; dump(l); Java Advanced / Новые возможности Java 5

  15. Проблема 2 • Метод void draw(List<Shape> c) { for (Iterator<Shape> i = c.iterator(); i.hasNext(); ) { Shape s = i.next(); s.draw(); } } • Вызовы • List<Shape> l; draw(l); • List<Circle> l; draw(l); Java Advanced / Новые возможности Java 5

  16. Решение 2 –bounded wildcard • Метод void draw(List<? extends Shape> c) { for (Iterator<? extends Shape> i = c.iterator(); i.hasNext(); ) { Shape s = i.next(); s.draw(); } } • Вызовы • List<Shape> l; draw(l); • List<Circle> l; draw(l); Java Advanced / Новые возможности Java 5

  17. Проблема 3 • Метод void addAll(Object[] a, Collection<?> c) { for (int i = 0; i < a.length; i++) { c.add(a[i]); } } Java Advanced / Новые возможности Java 5

  18. Решение 3 –generic-метод • Метод <T> void addAll(T[] a, Collection<T> c) { for (int i = 0; i < a.length; i++) { c.add(a[i]); } } • Примеры использования • addAll(new String[10], new ArrayList<String>()); • addAll(new Object[10], new ArrayList<Object>()); • addAll(new String[10], new ArrayList<Object>()); • addAll(new Object[10], new ArrayList<String>()); Java Advanced / Новые возможности Java 5

  19. Проблема 4 • Метод <T> void addAll(Collection<T> c, Collection<T> c2) { for (Iterator<T> i = c.iterator(); i.hasNext(); ) { T o = i.next(); c2.add(o); } } • Примеры использования • addAll(new AL<Integer>(), new AL<Integer>()); • addAll(new AL<Integer>(), new AL<Object>()); Java Advanced / Новые возможности Java 5

  20. Решение 4– bounded type argument • Метод <T, S extends T> void addAll(Collection<S> c, Collection<T> c2) { for (Iterator<S> i = c.iterator(); i.hasNext(); ) { S o = i.next(); c2.add(o); } } • Примеры использования • addAll(new AL<Integer>(), new AL<Integer>()); • addAll(new AL<Integer>(), new AL<Object>()); Java Advanced / Новые возможности Java 5

  21. Решение 4’ – bounded wildcard • Метод <T> void addAll(Collection<? extends T> c, Collection<T> c2) { for (Iterator<T> i = c.iterator(); i.hasNext(); ) { T o = i.next(); c2.add(o); } } • Примеры использования • addAll(new AL<Integer>(), new AL<Integer>()); • addAll(new AL<Integer>(), new AL<Object>()); Java Advanced / Новые возможности Java 5

  22. Проблема 5 • Метод <T extends Comparable<T>> T max(Collection<T> c) { … } • Пример использования • List<Integer> il; Integer I = max(il); • class Test implements Comparable<Object> {…} List<Test> tl; Test t = max(tl); Java Advanced / Новые возможности Java 5

  23. Решение 5 – upper bounded wcard • Метод <T extends Comparable<? super T>> max(Collection<T> c) { … } • Пример использования • List<Intger> il; Integer I = max(il); • class Test implements Comparable<Object> {…} List<Test> tl; Test t = max(tl); Java Advanced / Новые возможности Java 5

  24. Ограничения Generic • Невозможно создать массив параметра типа • Collection<T> c; • T[] ta; • new T[10]; • Невозможно создать массив Generic-классов • new ArrayList<List<Integer>>(); • List<?>[] la = new List<?>[10]; • List<Integer>[] la = new List<Integer>[10]; Java Advanced / Новые возможности Java 5

  25. Часть 3 Смешение generic и не-generic кода

  26. Generic – одинкласс • Примеры List<String> ls; List<Integer> li; ls.getClass() == li.getClass() // True ls instanceof List // True ls instanceof List<String> Java Advanced / Новые возможности Java 5

  27. Пример кода Collection<Integer> c; Iterator<Integer> i = c.iterator(); Integer max = i.next(); while(i.hasNext()) { Integer next = i.next(); if (next.compareTo(result) > 0) { max = next; } } Java Advanced / Новые возможности Java 5

  28. Код без 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; } } Java Advanced / Новые возможности Java 5

  29. Преобразование типов • Уничтожение информации о типе • List l = new ArrayList<String>(); • Добавление информации о типе • List<String> l = (List<String>) new ArrayList(); • List<String> l1 = new ArrayList(); • Unchecked warning Java Advanced / Новые возможности Java 5

  30. Часть 4 Autoboxing

  31. Примитивные типы и обертки Java Advanced / Новые возможности Java 5

  32. Boxing и Unboxing • Boxing – заключение значения примитивного типа в обертку int a = …; new Integer(a) • Unboxing – извлечение значения примитивного типа из обертки Integer a = …; a.intValue() Java Advanced / Новые возможности Java 5

  33. Autoboxing • Генерация кода для boxing и unboxing при необходимости • Явное приведение типов • (Integer) 10 • (int) new Integer(10) • (Object) 10 • Приведение типов “по ходу” Java Advanced / Новые возможности Java 5

  34. Пример • Исходный код 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()); Java Advanced / Новые возможности Java 5

  35. Пример. Подсчет количеств слов Map<String, Integer> map = new TreeMap<String, Integer>(); for (Iterator<String> i = c.iterator(); i.hasNext(); ) { String word = i.next(); Integer count = map.get(word); m.put(word, (count == null) ? 1 : count + 1); } Java Advanced / Новые возможности Java 5

  36. Особенности Autoboxing • Обработка nullпри unboxing • NullPointerException • Сравнение на равенство (==) • Примитивные типы сравниваются по значению • Обертки сравниваются по ссылке • Снижение производительности Java Advanced / Новые возможности Java 5

  37. Часть 5 Расширенный цикл for

  38. Пример. Сумма чисел в коллекции (1) • Старый вариант (проверка на null) int sum = 0; for (Iterator<Integer> i = c.iterator(); i.hasNext(); ) { Integer j = i.next(); if (j != null) { sum += j; } } Java Advanced / Новые возможности Java 5

  39. Пример. Сумма чисел в коллекции (2) • Новый вариант(проверка на null) int sum = 0; for (Integer j : c) { if (j != null) { sum += j; } } Java Advanced / Новые возможности Java 5

  40. Пример. Сумма чисел в коллекции (3) • Старый вариант int sum = 0; for (Iterator<Integer> i = c.iterator(); i.hasNext(); ) { sum += i.next(); } • Новый вариант int sum = 0; for (int j : c) { sum += j; } Java Advanced / Новые возможности Java 5

  41. Пример. Минимум в массиве • Старый вариант 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; } Java Advanced / Новые возможности Java 5

  42. Пример. Подсчет количеств слов Map<String, Integer> map = new TreeMap<String, Integer>(); for (String word : c) { Integer count = map.get(word); m.put(word, (count == null) ? 1 : count + 1); } Java Advanced / Новые возможности Java 5

  43. Интерфейс Iterable<E> • Позволяет использовать новый for public interface Iterable<T> { Iterator<T> iterator(); } • Реализуется стандартными коллекциями Java Advanced / Новые возможности Java 5

  44. Часть 6 Varargs и format

  45. Varargs • Механизм создания методов, принимающих переменное число параметров Java Advanced / Новые возможности Java 5

  46. Методы .format • Позволяют форматировать строки аналогично функции printf • Классы • Formatter • String • PrintWriter • Пример • String.format("(%d, %d)--(%d, %.3f)", 1, 1, 2, 0.5) • System.out.format(“Hello %s ", userName) Java Advanced / Новые возможности Java 5

  47. Определение метода • Метод format • format(String pattern, Object… arguments) • Общий случай • Последний аргумент может быть объявлен в виде • T … <имя аргумента> • Реальный тип аргумента T[] • Может передаваться либо массив, либо переменное число аргументов Java Advanced / Новые возможности Java 5

  48. Пример. Нахождение минимума • Пример метода 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}) Java Advanced / Новые возможности Java 5

  49. Интерфейс Formattable • Аналог метода toString()для класса Formattable(%s) • Определение интерфейса interface Formattable { void formatTo( Formatter formatter, // куда выводить int flags, // как выводить int width, // мин. ширина поля int precision// макс. ширина поля ) } Java Advanced / Новые возможности Java 5

  50. Часть 7 Static Import

More Related