Новые возможности java 5
DESCRIPTION
Новые возможности Java 5. Java Advanced. Краткое содержание. Что такое generic Реализация Generic Смешение generic и не generic- кода Autoboxing Расширенный for Varargs и format Static Import Перечисления Заключение. Часть 1. Что такое generic. Что такое Generic. - PowerPoint PPT PresentationTRANSCRIPT
Новые возможности Java 5
Java Advanced
Java Advanced / Новые возможности Java 5 2Georgiy Korneev
Краткое содержание
1. Что такое generic
2. Реализация Generic
3. Смешение generic и не generic-кода
4. Autoboxing
5. Расширенный for
6. Varargs и format
7. Static Import
8. Перечисления
9. Заключение
Что такое genericЧасть 1
Java Advanced / Новые возможности Java 5 4Georgiy Korneev
Что такое Generic
Generic ─ параметризация класса времени компиляции Совместимость типов проверяется при
компиляции Во время исполнения информация о
фактическом типе отсутствует Единая реализация
Template – параметризация класса времени исполнения
Java Advanced / Новые возможности Java 5 5Georgiy Korneev
Generics и коллекции
Коллекции, множетсва, списки, … параметризуются типом элемента Collection<E> Set<E> List<E> …
Отображения параметризуются типами ключа и значения Map<K, V> SortedMap<K, V> …
Java Advanced / Новые возможности Java 5 6Georgiy Korneev
Пример определения 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 7Georgiy Korneev
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 8Georgiy Korneev
Пример. Подсчет количества слов
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 9Georgiy Korneev
Пример реализации 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 10Georgiy Korneev
Несовместимость 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 11Georgiy Korneev
Проверка типов времени исполнения
Класс Collections List<S> checkedList(List<S>, S.class) checkedCollection checkedMap …
Реализация GenericЧасть 2
Java Advanced / Новые возможности Java 5 13Georgiy Korneev
Проблема 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 14Georgiy Korneev
Решение 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 15Georgiy Korneev
Проблема 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 16Georgiy Korneev
Решение 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 17Georgiy Korneev
Проблема 3
Методvoid addAll(Object[] a, Collection<?> c) {
for (int i = 0; i < a.length; i++) {
c.add(a[i]);
}
}
Java Advanced / Новые возможности Java 5 18Georgiy Korneev
Решение 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 19Georgiy Korneev
Проблема 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 20Georgiy Korneev
Решение 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 21Georgiy Korneev
Решение 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 22Georgiy Korneev
Проблема 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 23Georgiy Korneev
Решение 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 24Georgiy Korneev
Ограничения 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];
Смешение generic и не-generic кода
Часть 3
Java Advanced / Новые возможности Java 5 26Georgiy Korneev
Generic – один класс
ПримерыList<String> ls;
List<Integer> li;
ls.getClass() == li.getClass() // True
ls instanceof List // True
ls instanceof List<String>
Java Advanced / Новые возможности Java 5 27Georgiy Korneev
Пример кода
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 28Georgiy Korneev
Код без 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 29Georgiy Korneev
Преобразование типов
Уничтожение информации о типе List l = new ArrayList<String>();
Добавление информации о типе List<String> l = (List<String>) new ArrayList(); List<String> l1 = new ArrayList();
Unchecked warning
AutoboxingЧасть 4
Java Advanced / Новые возможности Java 5 31Georgiy Korneev
Примитивные типы и обертки
Примитивный тип Тип-обертка
boolean Boolean
byte Byte
short Short
char Character
int Integer
long Long
float Float
double Double
void Void
Java Advanced / Новые возможности Java 5 32Georgiy Korneev
Boxing и Unboxing
Boxing – заключение значения примитивного типа в оберткуint a = …;
new Integer(a)
Unboxing – извлечение значения примитивного типа из оберткиInteger a = …;
a.intValue()
Java Advanced / Новые возможности Java 5 33Georgiy Korneev
Autoboxing
Генерация кода для boxing и unboxing при необходимости
Явное приведение типов (Integer) 10 (int) new Integer(10) (Object) 10
Приведение типов “по ходу”
Java Advanced / Новые возможности Java 5 34Georgiy Korneev
Пример
Исходный код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 35Georgiy Korneev
Пример. Подсчет количеств слов
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 36Georgiy Korneev
Особенности Autoboxing
Обработка null при unboxing NullPointerException
Сравнение на равенство (==) Примитивные типы сравниваются по значению Обертки сравниваются по ссылке
Снижение производительности
Расширенный цикл forЧасть 5
Java Advanced / Новые возможности Java 5 38Georgiy Korneev
Пример. Сумма чисел в коллекции (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 39Georgiy Korneev
Пример. Сумма чисел в коллекции (2)
Новый вариант (проверка на null)int sum = 0;
for (Integer j : c) {
if (j != null) {
sum += j;
}
}
Java Advanced / Новые возможности Java 5 40Georgiy Korneev
Пример. Сумма чисел в коллекции (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 41Georgiy Korneev
Пример. Минимум в массиве
Старый вариант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 42Georgiy Korneev
Пример. Подсчет количеств слов
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 43Georgiy Korneev
Интерфейс Iterable<E>
Позволяет использовать новый forpublic interface Iterable<T> {
Iterator<T> iterator();
}
Реализуется стандартными коллекциями
Varargs и formatЧасть 6
Java Advanced / Новые возможности Java 5 45Georgiy Korneev
Varargs
Механизм создания методов, принимающих переменное число параметров
Java Advanced / Новые возможности Java 5 46Georgiy Korneev
Методы .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 47Georgiy Korneev
Определение метода
Метод format format(String pattern, Object… arguments)
Общий случай Последний аргумент может быть объявлен в
виде T … <имя аргумента>
Реальный тип аргумента T[] Может передаваться либо массив, либо
переменное число аргументов
Java Advanced / Новые возможности Java 5 48Georgiy Korneev
Пример. Нахождение минимума
Пример метода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 49Georgiy Korneev
Интерфейс Formattable
Аналог метода toString() для класса Formattable (%s)
Определение интерфейсаinterface Formattable { void formatTo( Formatter formatter, // куда выводить int flags, // как выводить int width, // мин. ширина поля int precision // макс. ширина поля ) }
Static ImportЧасть 7
Java Advanced / Новые возможности Java 5 51Georgiy Korneev
Импортирование статических членов
Импортирование поляimport static java.lang.Math.PI;
…
angle = PI / 2
Импортирования методаimport static java.lang.Math.cos;
…
cos(angle)
Java Advanced / Новые возможности Java 5 52Georgiy Korneev
Применение Static Import
При многократном доступе к статическим полям или методам других классов
Для методоыв импортируются все перегруженные версии
Широкое применение Static Import снижает читаемость кода
ПеречисленияЧасть 8
Java Advanced / Новые возможности Java 5 54Georgiy Korneev
Как было раньше
Примерpublic final static int NEW = 1;
public final static int RUNNING = 2;
public final static int BLOCKED = 3;
public final static int FINISHED = 4;
Проблемы Нет проверки типов Нет проверки уникальности Плохая расширяемость Малая информативность
Java Advanced / Новые возможности Java 5 55Georgiy Korneev
Перечислимый тип
Примерpublic enum State {
NEW,
RUNNING,
BLOCKED,
FINISHED
}
Каждое перечисление является независимой областью видимости
Java Advanced / Новые возможности Java 5 56Georgiy Korneev
Идентификация переменных
Классом Экземпляром Именем Номером
Имя Идентификатор экземпляра Метод name()
Номер Может быть передан в конструктор экземпляра Метод ordinal()
Java Advanced / Новые возможности Java 5 57Georgiy Korneev
Перечисления как классы
Перечисление может иметь Закрытые конструкторы Поля Методы Абстрактные методы, если они определены в
каждом экземпляре
Перечисление может реализовывать интерфейсы
Java Advanced / Новые возможности Java 5 58Georgiy Korneev
Пример. Меры длины (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; }}
Java Advanced / Новые возможности Java 5 59Georgiy Korneev
Пример. Операции (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);}
Java Advanced / Новые возможности Java 5 60Georgiy Korneev
Пример. Операции (2)
double apply(Operation op, double x,
double y) {
return op.eval(x, y);
}
Java Advanced / Новые возможности Java 5 61Georgiy Korneev
Методы работы с перечислениями
Класс Enum – базовый для перечислений name() – имя ordinal() – номер valueOf(Class, name) – экземпляр по номеру
Дополнительные values() – все экземпляры valueOf(name) – экземпляр по имени
Java Advanced / Новые возможности Java 5 62Georgiy Korneev
Пример. Меры длины (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
));
}
}
Java Advanced / Новые возможности Java 5 63Georgiy Korneev
Класс EnumSet
Множество экземпляров перечисленияХраниться побитноСоздание EnumSet
EnumSet<T> EnumSet.noneOf(T.class) EnumSet<T> EnumSet.allOf(T.class) EnumSet<T> EnumSet.of(e1, e2, …) EnumSet<T> EnumSet.copyOf(EnumSet<T> s) EnumSet<T> EnumSet.copyOf(Collection<T> t) EnumSet<T>
EnumSet.complementOf(EnumSet<T> s)
Java Advanced / Новые возможности Java 5 64Georgiy Korneev
Класс EnumMap
Отображение из перечисленияХраниться в массивеСоздание EnumMap
EnumMap<K, V>(K.class) EnumMap<K, V>(EnumMap<K, V>) EnumMap<K, V>(Map<K, V>)
ЗаключениеЧасть 9
Java Advanced / Новые возможности Java 5 66Georgiy Korneev
Ссылки (1)
Generics Tutorial // http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
JSR 14 (Generics) // http://jcp.org/en/jsr/detail?id=14
Autoboxing // http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html
JSR 201 (Autoboxing) // http://jcp.org/en/jsr/detail?id=201
Java Advanced / Новые возможности Java 5 67Georgiy Korneev
Ссылки (2)
New Java Language Fatures // http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html#lang
Enums (JLS) // http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.9
Import Declarations (JLS) // http://java.sun.com/docs/books/jls/third_edition/html/packages.html#7.5
Java Advanced / Новые возможности Java 5 68Georgiy Korneev
Ссылки (3)
Interfaces (JLS) // http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html
Java Advanced / Новые возможности Java 5 69Georgiy Korneev
Вопросы