690 likes | 1.01k Views
Новые возможности Java 5. Java Advanced. Краткое содержание. Что такое generic Реализация Generic Смешение generic и не generic- кода Autoboxing Расширенный for Varargs и format Static Import Перечисления Заключение. Часть 1. Что такое generic. Что такое Generic.
E N D
Новые возможности Java 5 Java Advanced
Краткое содержание • Что такое generic • Реализация Generic • Смешение generic и не generic-кода • Autoboxing • Расширенный for • Varargs и format • Static Import • Перечисления • Заключение Java Advanced / Новые возможности Java 5
Часть 1 Что такое generic
Что такое Generic • Generic ─ параметризация класса времени компиляции • Совместимость типов проверяется при компиляции • Во время исполнения информация о фактическом типе отсутствует • Единая реализация • Template – параметризация класса времени исполнения Java Advanced / Новые возможности Java 5
Generics и коллекции • Коллекции, множетсва, списки, … параметризуются типом элемента • Collection<E> • Set<E> • List<E> • … • Отображения параметризуются типами ключа и значения • Map<K, V> • SortedMap<K, V> • … Java Advanced / Новые возможности Java 5
Пример определения 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
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
Пример. Подсчет количества слов 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
Пример реализации 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
Несовместимость 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
Проверка типов времени исполнения • Класс Collections • List<S> checkedList(List<S>, S.class) • checkedCollection • checkedMap • … Java Advanced / Новые возможности Java 5
Часть 2 Реализация Generic
Проблема 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
Решение 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
Проблема 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
Решение 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
Проблема 3 • Метод void addAll(Object[] a, Collection<?> c) { for (int i = 0; i < a.length; i++) { c.add(a[i]); } } Java Advanced / Новые возможности Java 5
Решение 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
Проблема 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
Решение 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
Решение 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
Проблема 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
Решение 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
Ограничения 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
Часть 3 Смешение generic и не-generic кода
Generic – одинкласс • Примеры List<String> ls; List<Integer> li; ls.getClass() == li.getClass() // True ls instanceof List // True ls instanceof List<String> Java Advanced / Новые возможности Java 5
Пример кода 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
Код без 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
Преобразование типов • Уничтожение информации о типе • List l = new ArrayList<String>(); • Добавление информации о типе • List<String> l = (List<String>) new ArrayList(); • List<String> l1 = new ArrayList(); • Unchecked warning Java Advanced / Новые возможности Java 5
Часть 4 Autoboxing
Примитивные типы и обертки Java Advanced / Новые возможности Java 5
Boxing и Unboxing • Boxing – заключение значения примитивного типа в обертку int a = …; new Integer(a) • Unboxing – извлечение значения примитивного типа из обертки Integer a = …; a.intValue() Java Advanced / Новые возможности Java 5
Autoboxing • Генерация кода для boxing и unboxing при необходимости • Явное приведение типов • (Integer) 10 • (int) new Integer(10) • (Object) 10 • Приведение типов “по ходу” Java 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()); Java Advanced / Новые возможности Java 5
Пример. Подсчет количеств слов 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
Особенности Autoboxing • Обработка nullпри unboxing • NullPointerException • Сравнение на равенство (==) • Примитивные типы сравниваются по значению • Обертки сравниваются по ссылке • Снижение производительности Java Advanced / Новые возможности Java 5
Часть 5 Расширенный цикл for
Пример. Сумма чисел в коллекции (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
Пример. Сумма чисел в коллекции (2) • Новый вариант(проверка на null) int sum = 0; for (Integer j : c) { if (j != null) { sum += j; } } Java Advanced / Новые возможности Java 5
Пример. Сумма чисел в коллекции (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
Пример. Минимум в массиве • Старый вариант 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
Пример. Подсчет количеств слов 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
Интерфейс Iterable<E> • Позволяет использовать новый for public interface Iterable<T> { Iterator<T> iterator(); } • Реализуется стандартными коллекциями Java Advanced / Новые возможности Java 5
Часть 6 Varargs и format
Varargs • Механизм создания методов, принимающих переменное число параметров Java 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) Java Advanced / Новые возможности Java 5
Определение метода • Метод format • format(String pattern, Object… arguments) • Общий случай • Последний аргумент может быть объявлен в виде • T … <имя аргумента> • Реальный тип аргумента T[] • Может передаваться либо массив, либо переменное число аргументов Java 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}) Java Advanced / Новые возможности Java 5
Интерфейс Formattable • Аналог метода toString()для класса Formattable(%s) • Определение интерфейса interface Formattable { void formatTo( Formatter formatter, // куда выводить int flags, // как выводить int width, // мин. ширина поля int precision// макс. ширина поля ) } Java Advanced / Новые возможности Java 5
Часть 7 Static Import