Saint Petersburg, 2012 Java lecture #2 New features of Java5/6/7.

Презентация:



Advertisements
Похожие презентации
Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(two"); lst.add(three");
Advertisements

САОД кафедра ОСУ 1 Основные абстрактные типы данных Схема процесса создания программ для решения прикладных задач ВУ.
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
Перегрузка операторов x = a + b результат 1-й операнд2-й операнд оператор По количеству операндов операторы делятся на: унарные (один операнд) бинарные.
Учебный курс Объектно-ориентированный анализ и программирование Лекция 4 Трансформация логической модели в программный код Лекции читает кандидат технических.
Новые возможности Java 5 Java Advanced. 2Georgiy KorneevJava Advanced / Новые возможности Java 5 Краткое содержание 1.Что такое generic 2.Реализация Generic.
b5_java_s4
Michael Jackson
Синтаксис языка Java. Символы и синтаксис Перевод строчки эквивалентен пробелу Регистр в именах различается.
Ребусы Свириденковой Лизы Ученицы 6 класса «А». 10.
Функции Функция – именованная последовательность описаний и операторов, выполняющая некоторое действие. Может иметь параметры и возвращать значение. Функция.
Лекция 2 Раздел 2.1 Windows Phone Темы раздела 3.
Практическое программирование на Java к.ф.-м.н. Козлов Дмитрий Дмитриевич Кафедра АСВК, Лаборатория Вычислительных комплексов.
Школьная форма Презентация для родительского собрания.
Кафедра ОСУ, Java 2004 Слайд 1 Наследование Наследование позволяет использовать существующий класс для определения новых классов, т.е. способствует.
Изучение динамического определения типов. Класс Class. Динамическая загрузка и инстанцирование классов. В Java вся информация о классе хранится в специальном.
Test 6 Вопрос 1. Как можно уничтожить объект в Java? a)присвоить null всем ссылкам на объект b)вызвать Runtime.getRuntime().gc() c)вызвать метод finalize()
Типовые расчёты Растворы
ДЕЛЕГАТЫ Лекция 7 1. Зачем нужны делегаты 2 И данные, и код располагаются в памяти компьютера по определенным адресам. Передача адресов данных в C# происходит.
Новые возможности Java 5 Java Advanced. 2Georgiy KorneevJava Advanced / Новые возможности Java 5 Содержание Перечисления Метаданные Другие возможности.
Транксрипт:

Saint Petersburg, 2012 Java lecture #2 New features of Java5/6/7

Outline JAVA 5 Varargs Enhanced for Loop Enum Static import Autoboxing/Unboxing Generic Annotations JAVA 6 Collection Framework Deployment Internationalization Support JAR JConsole Networking Features Perfomance Scripting Swing JAVA 7 Language enhancements 2

Java 5. Varargs vararg - аргумент функции с варьирующимся количеством параметров. Java 1.4: String format(String pattern, Object[] arguments); Java 1.5: String format(String pattern, Object... arguments); Используется неопределенное количество переменных одного типа Должен быть последним параметром метода В вызывающем коде не требует создания дополнительного массива: Object[] arguments = {"Luke"}; String result = MessageFormat.format("{0}, Im your father, arguments); System.out.println(result); Usages: MessageFormat.format(String, Object..); System.out.printf(String, Object...); Logging; 3

Java 5. Varargs Example: Во внутреннем коде метода эквивалентен работе с массивом public int sum(int... b) { if (b == null) { return Integer.MIN_VALUE; } int r = 0; for (int i = 0; i < b.length; i++) { r += b[i]; } return r; } 4

Java 5. Varargs Example: Во внутреннем коде метода эквивалентен работе с массивом public int sum(int... b) { if (b == null) { return Integer.MIN_VALUE; } int r = 0; for (int i = 0; i < b.length; i++) { r += b[i]; } return r; } // ms.sum(); // 0 ms.sum(null); // ms.sum(1, 1, 1, 1); // 4 5

Java 5. Enhanced for Loop for each – сокращенная конструкция для доступа к элементам массива или коллекции Массивы: String[] friends = {"Rachel", "Monica", "Phoebe", "Joey", "Chandler", "Ross"}; // Old school for (int i = 0; i < friends.length; i++) { System.out.println(friends[i]); } // New school for (String f : friends) { System.out.println(f); } 6

Java 5. Enhanced for Loop for each – сокращенная конструкция для доступа к элементам массива или коллекции Массивы: String[] friends = {"Rachel", "Monica", "Phoebe", "Joey", "Chandler", "Ross"}; // Old school for (int i = 0; i < friends.length; i++) { System.out.println(friends[i]); } // New school for (String f : friends) { System.out.println(f); } Код стал короче и понятнее Нет индекса 7

Java 5. Enhanced for Loop Коллекции и классы, имплементирующие интерфейс Iterable Collection tBrand = new ArrayList (); tBrand.add("T-Home"); tBrand.add("T-Online"); tBrand.add("T-Mobile"); tBrand.add("T-Systems"); for (Object t : tBrand) { System.out.println(t); } Меньше возни с итераторами, не надо дополнительных переменных 8

Java 5. Enhanced for Loop Коллекции и классы, имплементирующие интерфейс Iterable Collection tBrand = new ArrayList (); tBrand.add("T-Home"); tBrand.add("T-Online"); tBrand.add("T-Mobile"); tBrand.add("T-Systems"); for (Object t : tBrand) { System.out.println(t); tBrand.remove(t); // java.util.ConcurrentModificationException!!! } Меньше возни с итераторами, не надо дополнительных переменных Коллекция доступна только в одном направлении и неизменяема 9

Java 5. enum enum – тип-перечисление. Может принимать только одно из заранее определенных значений. Определяется с помощью ключевого слова enum : public enum Seasons { WINTER, SPRING, SUMMER, AUTUMN } Является полноценным Java классом и наследует от java.lang.Enum все его методы. Не может наследовать никакой другой класс, но может реализовывать интерфейсы. Не может иметь публичного конструктора. Можно использовать в switch Встроенная поддержка защищенного синглтона 10

Java 5. enum static methods values() – все возможные значения энума for (Seasons s : Seasons.values()) { System.out.println(s); } // WINTER SPRING SUMMER AUTUMN 11

Java 5. enum static methods values() – все возможные значения энума for (Seasons s : Seasons.values()) { System.out.println(s); } // WINTER SPRING SUMMER AUTUMN valueOf(String) – возвращает энум, соответствующий строке Seasons.valueOf("WINTER"); // Seasons.WINTER Seasons.valueOf("Winter"); // java.lang.IllegalArgumentException!!! 12

Java 5. enum methods ordinal() – порядковый номер значения энума Seasons s = Seasons.AUTUMN; System.out.println(autumn.ordinal()); // 3 13

Java 5. enum methods ordinal() – порядковый номер значения энума Seasons s = Seasons.AUTUMN; System.out.println(autumn.ordinal()); // 3 Задача: получить количество музыкантов public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET; public int numberOfMusicians() { ??? } 14

Java 5. enum methods ordinal() – порядковый номер значения энума Seasons s = Seasons.AUTUMN; System.out.println(autumn.ordinal()); // 3 Задача: получить количество музыкантов public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET; public int numberOfMusicians() { return ordinal() + 1; } 15

Java 5. Autoboxing/Unboxing Autoboxing/Unboxing – автоматическая упаковка в объект. Давайте просто внимательно разберем пример import java.util.*; public class Test{ public static void main(String[] args) { Vector v = new Vector (); v.add(1); v.add(2); v.add(3); for(Integer i : v) { int assa = i; System.out.println(assa+100); } 16

Java 5. Autoboxing/Unboxing Заметьте, что в коллекцию можно вставлять объект типа Integer. И вообще в коллекцию можно было вставлять только наследников от Object. Т.е. раньше надо было писать v.add(new Integer(1)); v.add(new Integer(2)); v.add(new Integer(3)); А также получение числа из объекта Integer тоже надо было делать приведением типа к Integer и вызовом метода intValue(). В цикле это происходит автоматически. Вот в принципе и весь смысл этого нововведения. Но удобно очень 17

Java 5. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(two"); lst.add(three"); lst.remove(0); c.remove(0); System.out.println(lst.size()); System.out.println(c.size()); 18

Java 5. Road to Generics Класс - ящик для хранения других объектов class Box { private Object object; void add(Object object) { this.object = object; } Object get() { return object; } 19

Java 5. Road to Generics Класс - ящик для хранения других объектов class Box { private Object object; void add(Object object) { this.object = object; } Object get() { return object; } При использовании необходимо кастовать к нужному типу, это небезопасно Box integerBox = new Box(); integerBox.add(new Integer(10)); Integer someInteger = (Integer) integerBox.get(); 20

Java 5. Road to Generics Класс - ящик для хранения других объектов class Box { private Object object; void add(Object object) { this.object = object; } Object get() { return object; } При использовании необходимо кастовать к нужному типу, это небезопасно Box integerBox = new Box(); integerBox.add(new Integer(10)); integerBox.add(10); Integer someInteger = (Integer) integerBox.get(); //Exception!!! 21

Java 5. Road to Generics Можно защититься, но это неудобно: Box integerBox = new Box(); Object content = integerBox.get(); if (content instanceof Integer) { Integer someInteger = (Integer)integerBox.get(); System.out.println(someInteger + 5); } 22

Java 5. Road to Generics Можно защититься, но это неудобно: Box integerBox = new Box(); Object content = integerBox.get(); if (content instanceof Integer) { Integer someInteger = (Integer)integerBox.get(); System.out.println(someInteger + 5); } 23

Java 5. Road to Generics Generics: we can do it safe and clear! class Box { private T object; void add(T object) { this.object = object; } T get() { return object; } 24

Java 5. Generic classes Generics: we can do it safe and clear! class Box { private T object; void add(T object) { this.object = object; } T get() { return object; } Соответственно, использование изменится к лучшему: Box integerBox = new Box (); integerBox.add(new Integer(10)); Integer someInteger = integerBox.get(); 25

Java 5. Generic classes Generics: we can do it safe and clear! class Box { private T object; void add(T object) { this.object = object; } T get() { return object; } Соответственно, использование изменится к лучшему: Box integerBox = new Box (); integerBox.add(new Integer(10)); integerBox.add(10); // Не компилируется Integer someInteger = integerBox.get(); String someInteger = integerBox.get(); // Не компилируется 26

Java 5. Generic methods Также можно объявлять generic методы: class Box { private T object; void add(T object) { this.object = object; } T get() { return object; } void inspect(U u) { System.out.println("U: " + u.getClass().getName()); } 27

Java 5. Generic methods Также можно объявлять generic методы: class Box { private T object; void add(T object) { this.object = object; } T get() { return object; } static void fillBoxes(U u, List > boxes) { for (Box box : boxes) { box.add(u); } Box. fillBoxes(42, new ArrayList >()); 28

Java 5. Wildcards Generic types are invariant List не наследует List : Integer[] iArray = {1, 3, 2}; Object[] oArray = iArray; // OK List iList = new ArrayList (); List oList = iList; // Не компилируется 29

Java 5. Wildcards Generic types are invariant List не наследует List : Integer[] iArray = {1, 3, 2}; Object[] oArray = iArray; List iList = new ArrayList (); List oList = iList; // Не компилируется Чтобы решить эту проблему, можно использовать wildcard: – любой класс – ограничение снизу: все классы, которые являются наследниками Number – ограничение сверху: все классы, являющиеся родителями класса Number 30

Java 5. Generics Возможны множество вариантов инициализации: List list1 = new ArrayList (); List list2 = new ArrayList (); List list3 = new ArrayList (); List list4 = new ArrayList (); List is a subtype of List 31

Java 5. static import Статический импорт позволяет сделать public static поля одного класса доступными в другом import static edu.tsystems.practice.enums.Seasons.*; import static edu.tsystems.practice.enums.Seasons.AUTUMN; // Seasons autumn = AUTUMN; 32

Java 5. static import Статический импорт позволяет сделать public static поля одного класса доступными в другом import static edu.tsystems.practice.enums.Seasons.*; import static edu.tsystems.practice.enums.Seasons.AUTUMN; // Seasons autumn = AUTUMN; Используйте с осторожностью, когда необходим частый доступ к константам или статическим методам. Например, при написании JUnit тестов: org.junit.Assert Нежелательно использовать *, лучше импортировать по-одному 33

Java 5. Annotations JSR 175 A Metadata Facility for the JavaTM Programming Class, method, field, Class, runtime, 34

Java 6. Collection Framework Появились новые интерфейсы и реализации этих интерфейсов. Интерфейсы: Deque – развитие интерфейса Queue. Название расшифровывается как «double ended queue» и произносится как ДЕК. Основная идея в том, чтобы организовать очередь, которая работает с обоих концов – как FIFO (интерфейс Queue) и LIFO (интерфейс Stack) BlockingDeque – интерфейс позволяет блокировать себя при ожидании поступления в очередь элемента. NavigableSet, NavigableMap – интерфейсы позволяют искать наиболее близкое значение в наборе. ConcurrentNavigableMap – тоже, что и NavigableMap, но еще поддерживает рекурсию в подмэпах. 35

Java 6. Collection Framework / Deployment Реализации: ArrayDeque, ConcurrentSkipListSet, ConcurrentSkipListMap, LinckedBlockingDeque Изменились существующие классы, которые теперь реализуют новые интерфейсы. Это – LinkedList, TreeSet, TreeMap. Deployment (Java Web Start and Java Plug-in) Основная идея в том, что теперь изменен формат кэширования приложений для Web Start. Также появились некоторые дополнительные фичи при загрузке – система управления кэшем, поддержка параметра no-cache в HTTP-запросе. Есть некоторые изменения по безопасности, например, поддержка сертификатов. Улучшенный интерфейс при работа с Java Console. 36

Java 6. Internationalization Support / JAR Internationalization Support (Calendar) - Григорианский календарь (с версии 1.1) - Буддисткий календарь (с версии 1.4) - Японский императорский календарь (с версии 1.6) JAR (Java Archive Files) Появилось два класса-потока: 1. java.util.zip.DeflaterInputStream – чтение сжатых данных из потока 2. java.util.zip. InflaterOutputStream – запись сжатых данных в поток Это позволяет передавать по сети сжатые данные. Кроме этого были сделаны дополнения: Список файлов в архиве теперь не ограничен 64Кб (была такая проблема при больших архивах, где много файлов) Для Windows сделаны дополнения: имя файла теперь может быть длиннее 256 символов и ограничение на одновременное открытие более 2000 zip-файлов снято. Утилита JAR теперь имеет ключик e – он позволяет задать точку входа – аналог аттрибута Main-Class в манифесте. 37

Java 6. JConsole / Networking Features JConsole for Java SE 6 JConsole является официально поддерживаемой утилитой. Это утилита, которая в графическом виде позволяет заниматься мониторингом JVM. Networking Features Обновлены следующие классы java.net.NetworkInterface. Позволяет получить много информации: о маске подсети, broadcast адрес, MAC-адрес. java.net.InterfaceAddress. Позволяет получить информацию о сетевом интерфейсе, причем как для IPv4, так и для IPv6. Изменения коснулись также поддержки NTLM, HTTP-аутентификации и работы с куками. Отдельно я бы еще выделил создание двух пакетов, которые позволяют построить легковесный HTTP-сервер (Java HTTP Server)(Java HTTP Server) 38

Java 6. Perfomance / Scripting Perfomance Результаты тестов: Общая производительность вычислений возрасла более чем на 70%. Операции ввода/вывода – в два раза. Scripting Основная задача описана в JSR-223 Scripting for the Java Platform. Она состоит в том, чтобы можно «на лету» выполнить программу, написанную на каком-либо скриптовом языке. Главное, чтобы был реализован движок, который можно использовать. Java SE 6 содержит Rhino: JavaScript for Java - проект от Mozilla.JSR-223 Scripting for the Java Platform 39

Java 6. Swing Особенности: TrayIcon - теперь иконка в трее будет там, где это только возможно. SpalshScreen - при старте приложения можно вывести картинку на время загрузки. И если загрузка продолжается уже после старта JVM (вам что-то необходимо добавить, соеденить и прочее) вы можете управлять вашей картинкой. Обработка текста на LCD. При красивой прорисовке текста на LCD используеся не один цвет, а несколько для улучшения восприятия. Улучшена скорость OpenGL и DirectX Look & Feel - теперь они будут использовать сами ОС и ваши приложения будут выглядеть так же как нативные приложения, т.е. теперь LF используют данные из ОС, чтобы рисовать компоненты. Drag&Drop - теперь это будет очень просто реализовать Text Printing - была такая проблема, что текст мог раюиваться при печати пополам - вержняя часть строки на одной странице, нижняя - на другой. Теперь этой пробелмы не будет, утверждал докладчик. JTable теперь будет уметь сортировать и фильтровать. 40

Java 7. Language enhancements Улучшенный вывод типов (type inference) при создании generic-экземляров На сегодня в Java часто приходится повторяться при инициализации переменной generic-типом. Java 7 позволит делать так: Map > anagrams = new HashMap >(); может быть переписана так: Map > anagrams = new HashMap(); String в switch-case выражениях: String s =... ; switch(s) { case "foo": processFoo(s); break; } 41

Java 7. Language enhancements Автоматическое управление ресурсами До Java 7 для освобождения ресурсов помимо памяти приходится использовать конструкцию try-finally. Новый подход сделает код более компактным и устойчивым к ошибкам. Например, вместо такого кода: BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { br.close(); } можно будет написать: try (BufferedReader br = new BufferedReader(new FileReader(path)) { return br.readLine(); } 42

Java 7. Language enhancements Улучшенные литералы Поддержка подчёркиваний в числовых литералах для лучшей читаемости. Например, теперь можно записать 1000 как: int thousand = 1_000; или (один миллион) как int million = 1_000_000 бинарные литералы (вида 0b101 или 0B101 ) 43

Java 7. Language enhancements Улучшен механизм перехвата исключений Раньше: try { methodThatThrowsTwoExceptions(); } catch (ExceptionOne e) { // log and deal with ExceptionOne } catch (ExceptionTwo e) { // log and deal with ExceptionTwo } В Java 7 try { methodThatThrowsTwoExceptions(); } catch (ExceptionOne | ExceptionTwo e) { // log and deal with ExceptionOne and ExceptionTwo } 44

Questions