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

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

Upload: raoul

Post on 05-Jan-2016

83 views

Category:

Documents


0 download

DESCRIPTION

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

TRANSCRIPT

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

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

Java Advanced

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

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. Заключение

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

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

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

Java Advanced / Новые возможности Java 5 4Georgiy Korneev

Что такое Generic

Generic ─ параметризация класса времени компиляции Совместимость типов проверяется при

компиляции Во время исполнения информация о

фактическом типе отсутствует Единая реализация

Template – параметризация класса времени исполнения

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

Java Advanced / Новые возможности Java 5 5Georgiy Korneev

Generics и коллекции

Коллекции, множетсва, списки, … параметризуются типом элемента Collection<E> Set<E> List<E> …

Отображения параметризуются типами ключа и значения Map<K, V> SortedMap<K, V> …

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

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();

...

}

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

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);

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

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));

}

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

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]; } ...}

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

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

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

Java Advanced / Новые возможности Java 5 11Georgiy Korneev

Проверка типов времени исполнения

Класс Collections List<S> checkedList(List<S>, S.class) checkedCollection checkedMap …

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

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

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

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);

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

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);

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

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);

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

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);

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

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]);

}

}

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

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>());

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

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>());

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

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>());

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

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>());

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

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);

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

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);

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

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];

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

Смешение generic и не-generic кода

Часть 3

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

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>

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

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;

}

}

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

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;

}

}

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

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

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

AutoboxingЧасть 4

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

Java Advanced / Новые возможности Java 5 31Georgiy Korneev

Примитивные типы и обертки

Примитивный тип Тип-обертка

boolean Boolean

byte Byte

short Short

char Character

int Integer

long Long

float Float

double Double

void Void

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

Java Advanced / Новые возможности Java 5 32Georgiy Korneev

Boxing и Unboxing

Boxing – заключение значения примитивного типа в оберткуint a = …;

new Integer(a)

Unboxing – извлечение значения примитивного типа из оберткиInteger a = …;

a.intValue()

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

Java Advanced / Новые возможности Java 5 33Georgiy Korneev

Autoboxing

Генерация кода для boxing и unboxing при необходимости

Явное приведение типов (Integer) 10 (int) new Integer(10) (Object) 10

Приведение типов “по ходу”

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

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());

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

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);

}

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

Java Advanced / Новые возможности Java 5 36Georgiy Korneev

Особенности Autoboxing

Обработка null при unboxing NullPointerException

Сравнение на равенство (==) Примитивные типы сравниваются по значению Обертки сравниваются по ссылке

Снижение производительности

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

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

Page 38: Новые возможности  Java 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;

}

}

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

Java Advanced / Новые возможности Java 5 39Georgiy Korneev

Пример. Сумма чисел в коллекции (2)

Новый вариант (проверка на null)int sum = 0;

for (Integer j : c) {

if (j != null) {

sum += j;

}

}

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

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;

}

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

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;

}

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

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);

}

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

Java Advanced / Новые возможности Java 5 43Georgiy Korneev

Интерфейс Iterable<E>

Позволяет использовать новый forpublic interface Iterable<T> {

Iterator<T> iterator();

}

Реализуется стандартными коллекциями

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

Varargs и formatЧасть 6

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

Java Advanced / Новые возможности Java 5 45Georgiy Korneev

Varargs

Механизм создания методов, принимающих переменное число параметров

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

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)

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

Java Advanced / Новые возможности Java 5 47Georgiy Korneev

Определение метода

Метод format format(String pattern, Object… arguments)

Общий случай Последний аргумент может быть объявлен в

виде T … <имя аргумента>

Реальный тип аргумента T[] Может передаваться либо массив, либо

переменное число аргументов

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

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})

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

Java Advanced / Новые возможности Java 5 49Georgiy Korneev

Интерфейс Formattable

Аналог метода toString() для класса Formattable (%s)

Определение интерфейсаinterface Formattable { void formatTo( Formatter formatter, // куда выводить int flags, // как выводить int width, // мин. ширина поля int precision // макс. ширина поля ) }

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

Static ImportЧасть 7

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

Java Advanced / Новые возможности Java 5 51Georgiy Korneev

Импортирование статических членов

Импортирование поляimport static java.lang.Math.PI;

angle = PI / 2

Импортирования методаimport static java.lang.Math.cos;

cos(angle)

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

Java Advanced / Новые возможности Java 5 52Georgiy Korneev

Применение Static Import

При многократном доступе к статическим полям или методам других классов

Для методоыв импортируются все перегруженные версии

Широкое применение Static Import снижает читаемость кода

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

ПеречисленияЧасть 8

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

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;

Проблемы Нет проверки типов Нет проверки уникальности Плохая расширяемость Малая информативность

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

Java Advanced / Новые возможности Java 5 55Georgiy Korneev

Перечислимый тип

Примерpublic enum State {

NEW,

RUNNING,

BLOCKED,

FINISHED

}

Каждое перечисление является независимой областью видимости

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

Java Advanced / Новые возможности Java 5 56Georgiy Korneev

Идентификация переменных

Классом Экземпляром Именем Номером

Имя Идентификатор экземпляра Метод name()

Номер Может быть передан в конструктор экземпляра Метод ordinal()

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

Java Advanced / Новые возможности Java 5 57Georgiy Korneev

Перечисления как классы

Перечисление может иметь Закрытые конструкторы Поля Методы Абстрактные методы, если они определены в

каждом экземпляре

Перечисление может реализовывать интерфейсы

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

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; }}

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

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);}

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

Java Advanced / Новые возможности Java 5 60Georgiy Korneev

Пример. Операции (2)

double apply(Operation op, double x,

double y) {

return op.eval(x, y);

}

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

Java Advanced / Новые возможности Java 5 61Georgiy Korneev

Методы работы с перечислениями

Класс Enum – базовый для перечислений name() – имя ordinal() – номер valueOf(Class, name) – экземпляр по номеру

Дополнительные values() – все экземпляры valueOf(name) – экземпляр по имени

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

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

));

}

}

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

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)

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

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>)

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

ЗаключениеЧасть 9

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

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

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

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

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

Java Advanced / Новые возможности Java 5 68Georgiy Korneev

Ссылки (3)

Interfaces (JLS) // http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html

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

Java Advanced / Новые возможности Java 5 69Georgiy Korneev

Вопросы