Нововведения Java5 Часть 2

Содержание

Слайд 2

План лекции Форматированные ввод и вывод Изменения в структуре классов и пакетов

План лекции

Форматированные ввод и вывод
Изменения в структуре классов и пакетов

Слайд 3

Проблема Имеется: Существуют классы для работы со строками, имеющие сходную функциональность,

Проблема
Имеется: Существуют классы для работы со строками, имеющие сходную функциональность, но не

имеющие общего предка
Хотелось бы: Ввести общего родителя в форме интерфейса
Слайд 4

java.lang.CharSequence Это интерфейс Предоставляет доступ к объекту, являющемуся последовательностью символов Содержит

java.lang.CharSequence

Это интерфейс
Предоставляет доступ к объекту, являющемуся последовательностью символов
Содержит методы:
char charAt(int

index)
int length()
CharSequence subSequence(int start, int end)
String toString()
Реализующие классы:
java.lang.String
java.lang.StringBuffer
java.lang.StringBuilder
java.nio.CharBuffer
Слайд 5

java.lang.StringBuilder Новый класс для работы со строками По своим методам и

java.lang.StringBuilder

Новый класс для работы со строками
По своим методам и цели является

копией класса java.lang.StringBuffer
Отличается только тем, что не является безопасным с точки зрения многопоточности
Если объект изменяемой строки локален, то лучше использовать этот класс
Слайд 6

java.lang.Appendable Это интерфейс Предоставляет доступ к объекту, позволяющему добавлять к себе

java.lang.Appendable

Это интерфейс
Предоставляет доступ к объекту, позволяющему добавлять к себе символы и

их последовательности
Содержит методы:
Appendable append(char c)
Appendable append(CharSequence csq)
Appendable append(CharSequence csq, int start, int end)
Реализующие классы:
java.lang.StringBuffer
java.lang.StringBuilder
java.io.Writer
Слайд 7

java.lang.Readable Это интерфейс Предоставляет доступ к объекту, позволяющему считывать символы Содержит

java.lang.Readable

Это интерфейс
Предоставляет доступ к объекту, позволяющему считывать символы
Содержит методы:
int read(CharBuffer

cb)
Реализующие классы:
java.nio.CharBuffer
java.io.Reader
Слайд 8

Проблема Имеется: Хотелось бы: System.out.println("length = " + l); System.out.println("a=" +

Проблема

Имеется:
Хотелось бы:

System.out.println("length = " + l);
System.out.println("a=" + a + ";");

System.out.printf(
"length

= %d\na=%f;", l, a);
Слайд 9

Форматированные ввод и вывод java.util.Formatter Обеспечивает преобразования формата, позволяющие выводить числа,

Форматированные ввод и вывод
java.util.Formatter
Обеспечивает преобразования формата, позволяющие выводить числа, строки, время

и даты в практически любом нужном вам формате
java.util.Scanner
Позволяет использовать форматированный ввод и преобразовывать значения к нужным типам
Слайд 10

java.util.Formatter Конструкторы Имеет множество конструкторов, позволяющих задать следующие параметры (либо, если

java.util.Formatter Конструкторы

Имеет множество конструкторов, позволяющих задать следующие параметры (либо, если они не

заданы, использовать значения по умолчанию)
Объект вывода
Appendable a
File file
String fileName
OutputStream os
PrintStream ps
по умолчанию – без автоматического вывода
Кодовая таблица
String charSet
по умолчанию – текущая таблица
Параметры локализации
Locale locale
по умолчанию – текущие параметры
Слайд 11

java.util.Formatter Важные методы Formatter format(String fmtString, Object ... args) Форматирует указанные

java.util.Formatter Важные методы

Formatter format(String fmtString, Object ... args) Форматирует указанные аргументы в соответствии

со строкой форматирования
Formatter format(Locale loc, String fmtString, Object ... args)
Форматирует указанные аргументы в соответствии со строкой форматирования и указанной локализацией
Слайд 12

java.util.Formatter Важные методы IOException ioException() Возвращает объект исключения, генерируемый объектом-приемником, иначе

java.util.Formatter Важные методы

IOException ioException() Возвращает объект исключения, генерируемый объектом-приемником, иначе null
Appendable out() Возвращает ссылку

на объек-приемник выходных данных
Locale locale() Возвращает ссылку на объект локализации
Слайд 13

java.util.Formatter Важные методы String toString() Возвращает объект типа String, содержащий отформатированный

java.util.Formatter Важные методы

String toString() Возвращает объект типа String, содержащий отформатированный вывод
void flush() Переносит информацию

из буфера форматирования
void close() Закрывает объект форматировщика, освобождает ресурсы
Слайд 14

Строка форматирования Строка форматирования состоит из: простых символов Просто копируются в

Строка форматирования

Строка форматирования состоит из:
простых символов Просто копируются в вывод
спецификаторов формата Определяют способ

отображения аргументов
Спецификатор формата:
знак процента (%)
преобразующий спецификатор формата

Formatter fmt = new Formatter();
fmt.format("Formatting %s is easy! %d %f",
"with Java", 15, 12.3);

Слайд 15

Преобразующие спецификаторы формата

Преобразующие спецификаторы формата

Слайд 16

Возможности форматирования Порядковый номер аргумента Позволяет использовать не текущий аргумент, а

Возможности форматирования

Порядковый номер аргумента Позволяет использовать не текущий аргумент, а заданный
Относительный номер Позволяет

несколько раз вывести одно и то же значение без явной нумерации

fmt.format("%3$d %2$d %1$d", 1, 2, 3); // 3 2 1

Calendar c = Calendar.getInstance();
fmt.format("Today is day %te of %// Today is day 4 of December, 2006

Слайд 17

Возможности форматирования Управление регистром вывода Сложное форматирование времени и даты Задание

Возможности форматирования

Управление регистром вывода
Сложное форматирование времени и даты
Задание минимальной ширины поля

fmt.format("Some

%s", "String"); //Some String
fmt.format("Some %S", "String"); //Some STRING

fmt.format("Now is %tH:%fmt.format("Now is %tl:%// Now is 20:03 of 04.10.09
// Now is 8:03pm of 4 October 2009

fmt.format("%3s %3s %3s %3s ", "1", "22", "333", "4444");
// 1 22 333 4444

Слайд 18

Возможности форматирования Задание точности вывода для вещественных значений Выравнивание вывода Разделение

Возможности форматирования

Задание точности вывода для вещественных значений
Выравнивание вывода
Разделение групп цифр и

т.д.

fmt.format("%10.2f %10.8f", Math.PI, Math.PI);
// 3.14 3.14159265

fmt.format("%-10.2f|%10.2f", Math.PI, Math.PI);
// 3.14 | 3.14

fmt.format("%,d", Integer.MAX_VALUE);
// 2,147,483,647

Слайд 19

Метод printf() Автоматически создает и использует экземпляр класса Formatter Объявлен в

Метод printf()

Автоматически создает и использует экземпляр класса Formatter
Объявлен в классах:
java.io.PrintWriter

java.io.PrintStream
Имеет такие же параметры, что и метод Formatter.format()
Слайд 20

java.util.Scanner Конструкторы Задают один из возможных источников данных С указанием кодовой

java.util.Scanner Конструкторы

Задают один из возможных источников данных
С указанием кодовой таблицы и без
File
InputStream
java.nio.channels.ReadableByteChannel
Используя

Unicode
Readable
String
Слайд 21

java.util.Scanner Использование Считывает лексемы из указанного источника Лексема – обособленная посредством

java.util.Scanner Использование

Считывает лексемы из указанного источника
Лексема – обособленная посредством разделителей порция входных

данных, определяемая регулярным выражением, задающим формат ввода
Разделители можно настроить
Шаблон регулярного выражения можно задать собственный
Существуют готовые методы для базовых типов данных
Слайд 22

java.util.Scanner Важные методы boolean hasNextType(...) Возвращает true, если доступна следующая лексема

java.util.Scanner Важные методы

boolean hasNextType(...)
Возвращает true, если доступна следующая лексема указанного типа, иначе

false
boolean hasNext()
boolean hasNext(java.util.regex.Pattern pattern)
boolean hasNext(String pattern)
boolean hasNextByte()
boolean hasNextBigInteger()
...
Слайд 23

java.util.Scanner Важные методы Type nextType(...) Возвращает значение следующей лексемы. Выбрасывает java.util.NoSuchElementException

java.util.Scanner Важные методы

Type nextType(...)
Возвращает значение следующей лексемы. Выбрасывает java.util.NoSuchElementException
String next()
String next(Pattern pattern)
String

next(String pattern)
int nextInt()
double nextDouble()
...
Слайд 24

java.util.Scanner Пример использования Scanner in = new Scanner(System.in); double sum =

java.util.Scanner Пример использования

Scanner in = new Scanner(System.in);
double sum = 0.0;
while (in.hasNext()) {

if (in.hasNextDouble())
sum += in.nextDouble();
else
if ((in.next()).equals("done"))
break;
else
return;
}
...
Слайд 25

Проблема Имеется: Хотелось бы: List l = new LinkedList(); l.add(5); Object

Проблема

Имеется:
Хотелось бы:

List l = new LinkedList();
l.add(5);
Object I = l.get(0);
int i =

0;
if (I instanceof Integer)
i = (Integer)I;

List l = new LinkedList();
l.add(5);
int i = l.get(0);

Слайд 26

Обновленные коллекции Все интерфейсы коллекций стали параметризованными Включая итераторы! Все классы

Обновленные коллекции

Все интерфейсы коллекций стали параметризованными
Включая итераторы!
Все классы коллекций стали параметризованными
Обновился

класс java.util.Collections
Прежние методы модифицированы для работы с параметризованными типами
Появились новые методы
Появился новый тип оболочек (Checked), динамически обеспечивающих безопасность типов при работе с коллекцией
Слайд 27

Проблема Имеется: Хотелось бы: public Circle createAnotherLikeThis(Circle circle) throws Throwable {

Проблема

Имеется:
Хотелось бы:

public Circle createAnotherLikeThis(Circle circle) throws Throwable {
Class cls =

circle.getClass();
Class[] types = {Double.TYPE};
Constructor constr = cls.getConstructor(types);
Object[] args = {circle.getR()};
return (Circle) constr.newInstance(args);
}

public Circle createAnotherLikeThat(Circle circle) throws Throwable {
Class cls = circle.getClass();
Constructor constr = cls.getConstructor(Double.TYPE);
return constr.newInstance(circle.getR());
}

Слайд 28

Обновленная рефлексия Классы Class, Constructor теперь настраиваемые Допускается использование аргументов переменной

Обновленная рефлексия

Классы Class, Constructor теперь настраиваемые
Допускается использование аргументов переменной длины
Добавлен интерфейс

аннотированного элемента java.lang.reflect.AnnotatedElement
Этот интерфейс реализуются всеми классами, объекты которых представляют элементы, способные иметь аннотации
Методы интерфейса позволяют проверить наличие аннотации и получить объект аннотации
Слайд 29

Пример использования аннотаций import java.lang.annotation.*; import java.lang.reflect.*; @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation {

Пример использования аннотаций

import java.lang.annotation.*;
import java.lang.reflect.*;
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation { String str(); int val();

}
class Meta {
@MyAnnotation(str = "Two parameters", val = 19)
public static void myMeth(String str, int i) {
try {
Class c = Class.forName("Meta");
Method m = c.getMethod("myMeth", String.class, int.class);
MyAnnotation a = m.getAnnotation(MyAnnotation.class);
System.out.printf("%s %d", a.str(), a.val());
}
catch (Exception c) {/*Обработка*/};
}
public static void main(String[] args) {
myMeth("test", 10);
}
}
Слайд 30

Проблема Имеется: Заложенные в языке средства синхронизации и взаимодействия потоков инструкций

Проблема

Имеется:
Заложенные в языке средства синхронизации и взаимодействия потоков инструкций универсальные, но

низкоуровневые
Организация взаимодействия потоков часто требует значительных усилий при написании кода
Хотелось бы:
Высокоуровневый инструментарий
Готовые решения для часто встречающихся ситуаций
Слайд 31

java.util.concurrent Пакет содержит высокоуровневый инструментарий для многопоточных приложений Пакет содержит следующие

java.util.concurrent

Пакет содержит высокоуровневый инструментарий для многопоточных приложений
Пакет содержит следующие категории инструментов
Executors

– средства запуска потоков
Synchronizers – средства синхронизации работы потоков
Timing – вспомогательные средства контроля времени
Concurrent structures – структуры, корректно работающие в многопоточных приложениях (без блокировки всей структуры)
Слайд 32

java.util.concurrent java.util.concurrent.atomic пакет содержит классы оберток для базовых типов, обеспечивающие корректный

java.util.concurrent

java.util.concurrent.atomic пакет содержит классы оберток для базовых типов, обеспечивающие корректный доступ к

значениям в многопоточных приложениях
java.util.concurrent.locks пакет содержит высокоуровневые средства работы с блокировками и критическими секциями
Слайд 33

Изменения в пакете java.lang Добавлены новые подпакеты java.lang.annotation java.lang.instrument java.lang.management Добавлены

Изменения в пакете java.lang

Добавлены новые подпакеты
java.lang.annotation
java.lang.instrument
java.lang.management
Добавлены новые классы
Enum
ProcessBuilder
StringBuilder
Добавлены новые интерфейсы
Appendable
Iterable
Readable
Изменения в

классах и интерфейсах
Math
String
StringBuffer
Comparable
И т.д.
Слайд 34

Изменения в пакете java.util Модифицированные коллекции Появление классов форматированного ввода/вывода Появление подпакета java.util.concurrent и его подпакетов

Изменения в пакете java.util

Модифицированные коллекции
Появление классов форматированного ввода/вывода
Появление подпакета java.util.concurrent и

его подпакетов
Слайд 35

Нововведения Java7 © Составление, Будаев Д.С., Гаврилов А.В., 2013 Лекция 12.2 УНЦ «Инфоком» Самара 2013

Нововведения Java7

© Составление, Будаев Д.С., Гаврилов А.В., 2013

Лекция 12.2

УНЦ «Инфоком»
Самара
2013

Слайд 36

План лекции Бинарные литералы Разделители в числовых литералах Строки в предложениях

План лекции

Бинарные литералы
Разделители в числовых литералах
Строки в предложениях switch
Вывод типа
Блок try

с ресурсами
Отлов исключений нескольких типов
Слайд 37

Проблема Имеется: Хотелось бы: int m1 = 130816; int m2 =

Проблема

Имеется:
Хотелось бы:

int m1 = 130816;
int m2 = 0377;
int m3 = 0x780;
//

Что это за числа???

int m1 = 0b11111111100000000;
int m2 = 0b00000000011111111;
int m3 = 0B00000011110000000;

Слайд 38

Бинарные литералы Префиксы 0b 0B Полезны при работе с битовыми представлениями

Бинарные литералы

Префиксы
0b
0B
Полезны при работе с битовыми представлениями чисел, поскольку позволяют лучше

видеть:
саму структуру числа 0b0000111111110000 // 2040, 0x07f8
взаимосвязь чисел 0b0000111111111111 // 4095, 0x0fff 0b1111000000000000 // 61440, 0xf000
Слайд 39

Проблема Имеется: Хотелось бы: double v1 = 7583432455435.324521; double v2 =

Проблема

Имеется:
Хотелось бы:

double v1 = 7583432455435.324521;
double v2 = 532453245.3453425235;
// А это сколько,

много или мало???

double v1 = 7_583_432_455_435.324_521;
double v2 = 532_453_245.345_342_523_52;

Слайд 40

Подчеркивание в числовых литералах Можно использовать В литералах любых числовых типов

Подчеркивание в числовых литералах

Можно использовать
В литералах любых числовых типов 765_324_213_434L
В литералах в

любых системах счисления 0xFF_00_FF_00
В нужных местах числа 1_23_456_7890
В нужном количестве 6_____6
Слайд 41

Подчеркивание в числовых литералах Нельзя использовать В начале и в конце

Подчеркивание в числовых литералах

Нельзя использовать
В начале и в конце числа _123 123_
Рядом с

разделителем целой и дробной части 10_.01 10._01
Перед суффиксами L, F и D 1_L 1.1_F 1.1_D
В строковых литералах с числами "6_____6"
Слайд 42

Проблема Имеется: public static Gender convert(String s) { Gender g; if

Проблема

Имеется:

public static Gender convert(String s) {
Gender g;
if (s.equals("м") ||

s.equals("муж") ||
s.equals("муж.") || s.equals("мужской")) {
g = Gender.Male;
} else if (s.equals("ж") || s.equals("жен") ||
s.equals("жен.") || s.equals("женский")) {
g = Gender.Female;
} else {
g = Gender.Unknown;
}
return g;
}
Слайд 43

Проблема Хотелось бы: public static Gender convert(String s) { Gender g;

Проблема

Хотелось бы:

public static Gender convert(String s) {
Gender g;
switch (s)

{
case "м": case "муж": case "муж.": case "мужской":
g = Gender.Male; break;
case "ж": case "жен": case "жен.": case "женский":
g = Gender.Female; break;
default:
g = Gender.Unknown; break;
}
return g;
}
Слайд 44

Строки в предложениях switch В качестве проверяемого значения можно указывать ссылку

Строки в предложениях switch

В качестве проверяемого значения можно указывать ссылку на

объект строки
В качестве значений для сравнения можно указывать
строковые литералы
ссылки на строки, объявление которых снабжено модификатором final
Сравнение значений производится также, как если бы использовался метод String.equals()
регистр имеет значение
начальные и концевые пробелы имеют значение
Слайд 45

Проблема Имеется: Хотелось бы: List list = new ArrayList (); Map

Проблема

Имеется:
Хотелось бы:

List list = new ArrayList();
Map> m =
new

HashMap>();
// Зачем два раза писать одно и то же???

List list = new ArrayList<>();
Map> m = new HashMap<>();

Слайд 46

Вывод типа (type inference) Можно использовать, если компилятор из контекста может

Вывод типа (type inference)

Можно использовать, если компилятор из контекста может понять,

какие типы нужны
<> – «алмаз» (diamond)
В основном используется при создании объектов в ходе инициализации переменных
При создании объектов нельзя путать отсутствие указания типа (будет обобщенный тип) и оператор алмаз (будет вывод типа)
Из-за механизма стирания в параметризованных типах могут возникать непроверяемые компилятором приведения
Слайд 47

Проблема Имеется: FileWriter out = null; try { out = new

Проблема

Имеется:

FileWriter out = null;
try {
out = new FileWriter(fileName);
// Некоторый

вывод данных
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException ex) {
}
}
// По-хорошему ресурсы надо закрывать в блоке finally.
// Закрытие может выбрасывать исключения...
// И так для каждого ресурса…
Слайд 48

Проблема Хотелось бы: try (FileWriter out = new FileWriter(fileName)) { //

Проблема

Хотелось бы:

try (FileWriter out = new FileWriter(fileName)) {
// Некоторый вывод

данных
}

try (FileReader in = new FileReader(fileName1);
FileWriter out = new FileWriter(fileName2)) {
// Некоторая обработка данных
}

Слайд 49

Блок try с ресурсами Можно применять к ресурсам, объекты которых реализуют

Блок try с ресурсами

Можно применять к ресурсам, объекты которых реализуют интерфейс

java.lang.AutoCloseable
Содержит метод void close() throws Exception
От него наследуют многие интерфейсы, например java.io.Closeable
Можно объявлять несколько объектов в одном блоке
Закрываются ресурсы в порядке, обратном порядку объявления
Слайд 50

Блок try с ресурсами Блок может содержать и блоки catch, и

Блок try с ресурсами

Блок может содержать и блоки catch, и блок

finally
Код в них вызывается после того, как ресурс(ы) будут закрыты
Присутствует явное разделение исключений, возникающих из-за закрытия ресурсов и в ходе выполнения блока try
Если возникают оба вида исключений
Исключения закрытия «замалчиваются» (suppressed)
Все замолчанные исключения можно получить, вызвав метод getSupressed() у выброшенного исключения бизнес-логики
Слайд 51

Проблема Имеется: try { // Некоторая логика, ввод данных, рефлексия }

Проблема

Имеется:

try {
// Некоторая логика, ввод данных, рефлексия
}
catch (ClassNotFoundException ex) {

logger.log(ex);
throw ex;
}
catch (IOException ex) {
logger.log(ex);
throw ex;
}
// Дублирование кода. И что, метод для этого писать?..
Слайд 52

Проблема Имеется: try { // Некоторая логика, ввод данных, рефлексия }

Проблема

Имеется:

try {
// Некоторая логика, ввод данных, рефлексия
}
catch (Throwable ex) {

logger.log(ex);
throw ex;
}
// Радикально.
// Но если некоторые виды исключений все-таки надо
// различать, то что тогда делать? Особенно, если у них
// общий непосредственный предок?
Слайд 53

Проблема Хотелось бы: try { // Некоторая логика, ввод данных, рефлексия

Проблема

Хотелось бы:

try {
// Некоторая логика, ввод данных, рефлексия
}
catch (ClassNotFoundException |

IOException ex) {
logger.log(ex);
throw ex;
}
Слайд 54

Отлов исключений нескольких типов Нужные типы исключений разделяются вертикальной чертой |

Отлов исключений нескольких типов

Нужные типы исключений разделяются вертикальной чертой |
Блоков catch

с таким синтаксисом может быть много
В блоке catch можно использовать только общие методы указанных типов исключений
Переменная, куда помещается ссылка на объект исключения, неявно приобретает модификатор final
Слайд 55

Спасибо за внимание!

Спасибо за внимание!