Transcript Slide 1

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