Слайд 1Нововведения Java5
Часть 2
© Составление, Будаев Д.С., Гаврилов А.В., 2013
Лекция 12.1
УНЦ
«Инфоком»
Самара
2013
Слайд 2План лекции
Форматированные ввод и вывод
Изменения в структуре классов и пакетов
Слайд 3Проблема
Имеется:
Существуют классы для работы со строками, имеющие сходную функциональность, но
не имеющие общего предка
Хотелось бы:
Ввести общего родителя в форме интерфейса
Слайд 4java.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
Слайд 5java.lang.StringBuilder
Новый класс для работы со строками
По своим методам и цели
является копией класса java.lang.StringBuffer
Отличается только тем, что не является безопасным
с точки зрения многопоточности
Если объект изменяемой строки локален, то лучше использовать этот класс
Слайд 6java.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
Слайд 7java.lang.Readable
Это интерфейс
Предоставляет доступ к объекту, позволяющему считывать символы
Содержит методы:
int
read(CharBuffer cb)
Реализующие классы:
java.nio.CharBuffer
java.io.Reader
Слайд 8Проблема
Имеется:
Хотелось бы:
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.Scanner
Позволяет использовать
форматированный ввод и преобразовывать значения к нужным типам
Слайд 10java.util.Formatter
Конструкторы
Имеет множество конструкторов, позволяющих задать следующие параметры (либо, если они
не заданы, использовать значения по умолчанию)
Объект вывода
Appendable a
File file
String fileName
OutputStream
os
PrintStream ps
по умолчанию – без автоматического вывода
Кодовая таблица
String charSet
по умолчанию – текущая таблица
Параметры локализации
Locale locale
по умолчанию – текущие параметры
Слайд 11java.util.Formatter
Важные методы
Formatter format(String fmtString,
Object ... args)
Форматирует указанные аргументы в соответствии со
строкой форматирования
Formatter format(Locale loc,
String fmtString,
Object ... args)
Форматирует указанные аргументы в соответствии со строкой форматирования и указанной локализацией
Слайд 12java.util.Formatter
Важные методы
IOException ioException()
Возвращает объект исключения, генерируемый объектом-приемником, иначе null
Appendable out()
Возвращает
ссылку на объек-приемник выходных данных
Locale locale()
Возвращает ссылку на объект локализации
Слайд 13java.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
Объявлен в классах:
java.io.PrintWriter
java.io.PrintStream
Имеет такие же параметры, что и метод Formatter.format()
Слайд 20java.util.Scanner
Конструкторы
Задают один из возможных источников данных
С указанием кодовой таблицы и
без
File
InputStream
java.nio.channels.ReadableByteChannel
Используя Unicode
Readable
String
Слайд 21java.util.Scanner
Использование
Считывает лексемы из указанного источника
Лексема – обособленная посредством разделителей порция
входных данных, определяемая регулярным выражением, задающим формат ввода
Разделители можно настроить
Шаблон
регулярного выражения можно задать собственный
Существуют готовые методы для базовых типов данных
Слайд 22java.util.Scanner
Важные методы
boolean hasNextType(...)
Возвращает true, если доступна следующая лексема указанного типа,
иначе false
boolean hasNext()
boolean hasNext(java.util.regex.Pattern
pattern)
boolean hasNext(String pattern)
boolean hasNextByte()
boolean hasNextBigInteger()
...
Слайд 23java.util.Scanner
Важные методы
Type nextType(...)
Возвращает значение следующей лексемы. Выбрасывает java.util.NoSuchElementException
String next()
String next(Pattern
pattern)
String next(String pattern)
int nextInt()
double nextDouble()
...
Слайд 24java.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 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 {
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 extends Circle> cls = circle.getClass();
Constructor extends Circle> constr = cls.getConstructor(Double.TYPE);
return constr.newInstance(circle.getR());
}
Слайд 28Обновленная рефлексия
Классы Class, Constructor теперь настраиваемые
Допускается использование аргументов переменной длины
Добавлен
интерфейс аннотированного элемента java.lang.reflect.AnnotatedElement
Этот интерфейс реализуются всеми классами, объекты которых
представляют элементы, способные иметь аннотации
Методы интерфейса позволяют проверить наличие аннотации и получить объект аннотации
Слайд 29Пример использования аннотаций
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Проблема
Имеется:
Заложенные в языке средства синхронизации и взаимодействия потоков инструкций универсальные,
но низкоуровневые
Организация взаимодействия потоков часто требует значительных усилий при написании
кода
Хотелось бы:
Высокоуровневый инструментарий
Готовые решения для часто встречающихся ситуаций
Слайд 31java.util.concurrent
Пакет содержит высокоуровневый инструментарий для многопоточных приложений
Пакет содержит следующие категории
инструментов
Executors – средства запуска потоков
Synchronizers – средства синхронизации работы потоков
Timing
– вспомогательные средства контроля времени
Concurrent structures – структуры, корректно работающие в многопоточных приложениях (без блокировки всей структуры)
Слайд 32java.util.concurrent
java.util.concurrent.atomic
пакет содержит классы оберток для базовых типов, обеспечивающие корректный доступ
к значениям в многопоточных приложениях
java.util.concurrent.locks
пакет содержит высокоуровневые средства работы с
блокировками и критическими секциями
Слайд 33Изменения в пакете 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
и его подпакетов
Слайд 35Нововведения Java7
© Составление, Будаев Д.С., Гаврилов А.В., 2013
Лекция 12.2
УНЦ «Инфоком»
Самара
2013
Слайд 36План лекции
Бинарные литералы
Разделители в числовых литералах
Строки в предложениях switch
Вывод типа
Блок
try с ресурсами
Отлов исключений нескольких типов
Слайд 37Проблема
Имеется:
Хотелось бы:
int m1 = 130816;
int m2 = 0377;
int m3 =
0x780;
// Что это за числа???
int m1 = 0b11111111100000000;
int m2
= 0b00000000011111111;
int m3 = 0B00000011110000000;
Слайд 38Бинарные литералы
Префиксы
0b
0B
Полезны при работе с битовыми представлениями чисел, поскольку позволяют
лучше видеть:
саму структуру числа
0b0000111111110000 // 2040, 0x07f8
взаимосвязь чисел
0b0000111111111111 // 4095,
0x0fff
0b1111000000000000 // 61440, 0xf000
Слайд 39Проблема
Имеется:
Хотелось бы:
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 (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;
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
В качестве проверяемого значения можно указывать ссылку
на объект строки
В качестве значений для сравнения можно указывать
строковые литералы
ссылки
на строки, объявление которых снабжено модификатором final
Сравнение значений производится также, как если бы использовался метод String.equals()
регистр имеет значение
начальные и концевые пробелы имеют значение
Слайд 45Проблема
Имеется:
Хотелось бы:
List list = new ArrayList();
Map m =
new HashMap();
// Зачем два раза писать одно и
то же???
List list = new ArrayList<>();
Map> m = new HashMap<>();
Слайд 46Вывод типа (type inference)
Можно использовать, если компилятор из контекста может
понять, какие типы нужны
– «алмаз» (diamond)
В основном используется
при создании объектов в ходе инициализации переменных
При создании объектов нельзя путать отсутствие указания типа (будет обобщенный тип) и оператор алмаз (будет вывод типа)
Из-за механизма стирания в параметризованных типах могут возникать непроверяемые компилятором приведения
Слайд 47Проблема
Имеется:
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 (FileReader in = new FileReader(fileName1);
FileWriter out = new FileWriter(fileName2)) {
// Некоторая обработка данных
}
Слайд 49Блок try с ресурсами
Можно применять к ресурсам, объекты которых реализуют
интерфейс java.lang.AutoCloseable
Содержит метод void close() throws Exception
От него наследуют многие
интерфейсы, например java.io.Closeable
Можно объявлять несколько объектов в одном блоке
Закрываются ресурсы в порядке, обратном порядку объявления
Слайд 50Блок try с ресурсами
Блок может содержать и блоки catch, и
блок finally
Код в них вызывается после того, как ресурс(ы) будут
закрыты
Присутствует явное разделение исключений, возникающих из-за закрытия ресурсов и в ходе выполнения блока try
Если возникают оба вида исключений
Исключения закрытия «замалчиваются» (suppressed)
Все замолчанные исключения можно получить, вызвав метод getSupressed() у выброшенного исключения бизнес-логики
Слайд 51Проблема
Имеется:
try {
// Некоторая логика, ввод данных, рефлексия
}
catch (ClassNotFoundException
ex) {
logger.log(ex);
throw ex;
}
catch (IOException ex) {
logger.log(ex);
throw ex;
}
// Дублирование кода. И что, метод для этого писать?..
Слайд 52Проблема
Имеется:
try {
// Некоторая логика, ввод данных, рефлексия
}
catch (Throwable
ex) {
logger.log(ex);
throw ex;
}
// Радикально.
// Но если
некоторые виды исключений все-таки надо
// различать, то что тогда делать? Особенно, если у них
// общий непосредственный предок?
Слайд 53Проблема
Хотелось бы:
try {
// Некоторая логика, ввод данных, рефлексия
}
catch
(ClassNotFoundException | IOException ex) {
logger.log(ex);
throw ex;
}
Слайд 54Отлов исключений нескольких типов
Нужные типы исключений разделяются вертикальной чертой |
Блоков
catch с таким синтаксисом может быть много
В блоке catch можно
использовать только общие методы указанных типов исключений
Переменная, куда помещается ссылка на объект исключения, неявно приобретает модификатор final
Слайд 56Дополнительные источники
Арнолд, К. Язык программирования Java [Текст] / Кен Арнолд,
Джеймс Гослинг, Дэвид Холмс. – М. : Издательский дом «Вильямс»,
2001. – 624 с.
Вязовик, Н.А. Программирование на Java. Курс лекций [Текст] / Н.А. Вязовик. – М. : Интернет-университет информационных технологий, 2003. – 592 с.
Эккель, Б. Философия Java [Текст] / Брюс Эккель. – СПб. : Питер, 2011. – 640 с.
Шилдт, Г. Java 2, v5.0 (Tiger). Новые возможности [Текст] / Герберт Шилдт. – СПб. : БХВ-Петербург, 2005. – 206 с.
JavaSE at a Glance [Электронный ресурс]. – Режим доступа: http://www.oracle.com/technetwork/java/javase/overview/index.html, дата доступа: 21.10.2011.
JavaSE APIs & Documentation [Электронный ресурс]. – Режим доступа: http://www.oracle.com/technetwork/java/javase/documentation/api-jsp-136079.html, дата доступа: 21.10.2011.