Java. Новое поколение разработки - В этой книге представлен оригинальный и практичный взгляд на новые возможности Java 7 и новые языки для виртуальной машины Java (JVM), а также рассмотрены некоторые вспомогательные технологии, необходимые для создания Java-программ завтрашнего дня. Книга начинается с подробного описания новшеств Java 7, таких как работа с ресурсами в блоке try (конструкция try-with-resources) и новый неблокирующий ввод-вывод (NIO.2). Далее вас ждет экспресс-обзор трех сравнительно новых языков для виртуальной машины Java - Groovy, Scala и Clojure. Вы увидите четкие понятные примеры, которые помогут вам ознакомиться с десятками удобных и практичных приемов. Вы изучите современные методы разработки, обеспечения параллелизма, производительности, а также многие другие интересные темы.
Название: Java. Новое поколение разработки Автор: Бенджамин Эванс, Мартин Вербург Издательство: Питер Год: 2014 Страниц: 560 Формат: PDF Размер: 24,2 МБ ISBN: 978-5-496-00544-9 Качество: Отличное
Содержание:
Вступление Предисловие Благодарности Лондонское Java-сообщество www. coderanch. com Manning publications Особые благодарности Благодарности Бена Эванса Благодарности Мартина Вербурга Об этой книге Как работать с этой книгой Для кого предназначена книга Дорожная карта Соглашения в коде и материал для скачивания Требования к программному обеспечению Об авторах Иллюстрация на обложке От издательства Часть 1. Разработка на Java Глава 1. Введение в Java 7 1.1. Язык и платформа 1.2. Малое прекрасно - расширения языка Java, или Проект «Монета» 1.3. Изменения в рамках проекта «Монета» 1.3.1. Строки в конструкции switch 1.3.2. Усовершенствованный синтаксис для числовых литералов 1.3.3. Усовершенствованная обработка исключений 1.3.4. Использование ресурсов в блоке try (try-with-resources) 1.3.5. Ромбовидный синтаксис 1.3.6. Упрощенный вызов методов с переменным количеством аргументов 1.4. Резюме Глава 2. Новый ввод-вывод 2.1. История ввода-вывода в Java 2.1.1. Java 1.0-1.3 2.1.2. Java 1.4 и неблокирующий ввод-вывод 2.1.3. Введение в NIO.2 2.2. Path - основа файлового ввода-вывода 2.2.1. Создание пути 2.2.2. Получение информации о пути 2.2.3. Избавление от избыточности 2.2.4. Преобразование путей 2.2.5. Пути NIO.2 и класс File, существующий в Java 2.3. Работа с каталогами и деревьями каталогов 2.3.1. Поиск файлов в каталоге 2.3.2. Движение по дереву каталогов 2.4. Ввод-вывод файловой системы при работе с NIO.2 2.4.1. Создание и удаление файлов 2.4.2. Копирование и перемещение файлов 2.4.3. Атрибуты файлов 2.4.4. Быстрое считывание и запись данных 2.4.5. Уведомление об изменении файлов 2.4.6. SeekableByteChannel 2.5. Асинхронные операции ввода-вывода 2.5.1. Стиль с ожиданием 2.5.2. Стиль с применением обратных вызовов 2.6. Окончательная шлифовка технологии сокет - канал 2.6.1. NetworkChannel 2.6.2. MulticastChannel 2.7. Резюме Часть 2. Необходимые технологии Глава 3. Внедрение зависимостей 3.1. Дополнительные знания: понятие об инверсии управления и внедрении зависимостей 3.1.1. Инверсия управления 3.1.2. Внедрение зависимостей 3.1.3. Переход к внедрению зависимостей 3.2. Стандартизированное внедрение зависимостей в Java 3.2.1. Аннотация @Inject 3.2.2. Аннотация @Qualifier 3.2.3. Аннотация @Named 3.2.4. Аннотация @Scope 3.2.5. Аннотация @Singleton 3.2.6. Интерфейс Provider<T> 3.3. Guice 3 - эталонная реализация внедрения зависимостей в Java 3.3.1. Знакомство с Guice 3.3.2. Морские узлы - различные связи в Guice 3.3.3. Задание области видимости для внедренных объектов в Guice 3.4. Резюме Глава 4. Современная параллельная обработка 4.1. Теория параллелизма - базовый пример 4.1.1. Рассмотрение модели потоков в Java 4.1.2. Структурные концепции 4.1.3. Как и в каких случаях возникает конфликт 4.1.4. Источники издержек 4.1.5. Пример обработчика транзакций 4.2. Параллельная обработка с блочной структурой (до Java 5) 4.2.1. Синхронизация и блокировки 4.2.2. Модель состояния для потока 4.2.3. Полностью синхронизированные объекты 4.2.4. Взаимные блокировки 4.2.5. Почему synchronized? 4.2.6. Ключевое слово volatile 4.2.7. Неизменяемость 4.3. Составные элементы современных параллельных приложений 4.3.1. Атомарные классы - java. util. concurrent. atomic 4.3.2. Блокировки - java. util. concurrent. locks 4.3.3. CountDownLatch 4.3.4. ConcurrentHashMap 4.3.5. CopyOnWriteArrayList 4.3.6. Очереди 4.4. Контроль исполнения 4.4.1. Моделирование задач 4.4.2. ScheduledThreadPoolExecutor 4.5. Фреймворк fork/join (ветвление/слияние) 4.5.1. Простой пример fork/join 4.5.2. ForkJoinTask и захват работы 4.5.3. Параллелизация проблем 4.6. Модель памяти языка Java (JMM) 4.7. Резюме Глава 5. Файлы классов и байт-код 5.1. Загрузка классов и объекты классов 5.1.1. Обзор - загрузка и связывание 5.1.2. Объекты классов 5.1.3. Загрузчики классов 5.1.4. Пример - загрузчики классов при внедрении зависимостей 5.2. Использование дескрипторов методов 5.2.1. MethodHandle 5.2.2. MethodType 5.2.3. Поиск дескрипторов методов 5.2.4. Пример: сравнение рефлексии, использования посредников и дескрипторов методов 5.2.5. Почему стоит выбирать дескрипторы методов 5.3. Исследование файлов классов 5.3.1. Знакомство с javap 5.3.2. Внутренняя форма сигнатур методов 5.3.3. Пул констант 5.4. Байт-код 5.4.1. Пример: дизассемблирование класса 5.4.2. Среда времени исполнения 5.4.3. Введение в коды операций 5.4.4. Коды операций для загрузки и сохранения 5.4.5. Арифметические коды операций 5.4.6. Коды операций для контроля исполнения 5.4.7. Коды операций для активизации 5.4.8. Коды операций для работы с платформой 5.4.9. Сокращенные формы записи кодов операций 5.4.10. Пример: сцепление (конкатенация) строк 5.5. invokedynamic 5.5.1. Как работает invokedynamic 5.5.2. Пример: дизассемблирование invokedynamic-вызова 5.6. Резюме Глава 6. Понятие о повышении производительности 6.1. Терминологическое описание производительности - базовые определения 6.1.1. Ожидание 6.1.2. Пропускная способность 6.1.3. Коэффициент использования 6.1.4. Эффективность 6.1.5. Мощность 6.1.6. Масштабируемость 6.1.7. Деградация 6.2. Прагматический подход к анализу производительности 6.2.1. Знайте, что именно вы измеряете 6.2.2. Умейте проводить измерения 6.2.3. Знайте, какого уровня производительности вы хотите достичь 6.2.4. Знайте, когда следует прекратить оптимизацию 6.2.5. Знайте, какой ценой дается повышение производительности 6.2.6. Знайте об опасности поспешной оптимизации 6.3. Что пошло не так? И почему нас это должно волновать? 6.3.1. Закон Мура: прошлые и будущие тенденции изменения производительности 6.3.2. Понятие об иерархии латентности памяти 6.3.3. Почему так сложно выполнять оптимизацию производительности в Java 6.4. Вопрос времени - от железа и вверх 6.4.1. Аппаратные часы 6.4.2. Проблема с nanoTime() 6.4.3. Роль времени при повышении производительности 6.4.4. Практический пример: понятие о кэш-промахах 6.5. Сборка мусора 6.5.1. Основы 6.5.2. Отслеживание и очистка 6.5.3. jmap 6.5.4. Полезные переключатели виртуальной машины Java 6.5.5. Чтение журналов сборщика мусора 6.5.6. Визуализация использования памяти с помощью VisualVM 6.5.7. Анализ локальности 6.5.8. Параллельное отслеживание и очистка 6.5.9. G1 - новый сборщик мусора для Java 6.6. Динамическая компиляция с применением HotSpot 6.6.1. Знакомство с HotSpot 6.6.2. Встраиваемая подстановка методов 6.6.3. Динамическая компиляция и мономорфные вызовы 6.6.4. Чтение журналов компиляции 6.7. Резюме Часть 3. Многоязычное программирование на виртуальной машине Java Глава 7. Альтернативные языки для виртуальной машины Java 7.1. Языку Java недостает гибкости? Это провокация! 7.1.1. Система согласования 7.1.2. Концептуальные основы функционального программирования 7.1.3. Идиомы словаря и фильтра 7.2. Языковой зоопарк 7.2.1. Сравнение интерпретируемых и компилируемых языков 7.2.2. Сравнение динамической и статической типизации 7.2.3. Сравнение императивных и функциональных языков 7.2.4. Сравнение повторной реализации и оригинала 7.3. Многоязычное программирование на виртуальной машине Java 7.3.1. Зачем использовать другой язык вместо Java 7.3.2. Многообещающие языки 7.4. Как подобрать для проекта другой язык вместо Java 7.4.1. Высоки ли риски в области проекта 7.4.2. Насколько хорошо язык взаимодействует с Java 7.4.3. Имеется ли хороший инструментарий и поддержка данного языка на уровне тестов 7.4.4. Насколько сложно выучить данный язык 7.4.5. Насколько много разработчиков использует данный язык 7.5. Как виртуальная машина Java поддерживает альтернативные языки 7.5.1. Среда времени исполнения для не Java-языков 7.5.2. Фикции компилятора 7.6. Резюме Глава 8. Groovy - динамический приятель Java 8.1. Знакомство с Groovy 8.1.1. Компиляция и запуск 8.1.2. Консоль Groovy 8.2. Groovy 101 - синтаксис и семантика 8.2.1. Стандартный импорт 8.2.2. Числовая обработка 8.2.3. Переменные, сравнение динамических и статических типов, а также контекст 8.2.4. Синтаксис списков и словарей 8.3. Отличия от Java - ловушки для новичков 8.3.1. Опциональные точки с запятой и операторы возврата 8.3.2. Опциональные скобки для параметров методов 8.3.3. Модификаторы доступа 8.3.4. Обработка исключений 8.3.5. Оператор равенства в Groovy 8.3.6. Внутренние классы 8.4. Функции Groovy, пока отсутствующие в Java 8.4.1. GroovyBeans 8.4.2. Оператор безопасного разыменования 8.4.3. Оператор Элвис 8.4.4. Улучшенные строки 8.4.5. Функциональные литералы 8.4.6. Первоклассная поддержка для операций с коллекциями 8.4.7. Первоклассная поддержка работы с регулярными выражениями 8.4.8. Простая XML-обработка 8.5. Взаимодействие между Groovy и Java 8.5.1. Вызов Java из Groovy 8.5.2. Вызов Groovy из Java 8.6. Резюме Глава 9. Язык Scala - мощный и лаконичный 9.1. Быстрый обзор Scala 9.1.1. Scala - лаконичный язык 9.1.2. Сопоставимые выражения 9.1.3. Case-классы 9.1.4. Акторы 9.2. Подходит ли Scala для моего проекта? 9.2.1. Сравнение Scala и Java 9.2.2. Когда и каким образом приступать к использованию Scala 9.2.3. Признаки, указывающие, что Scala может не подойти для вашего проекта 9.3. Как вновь сделать код красивым с помощью Scala 9.3.1. Использование компилятора и REPL 9.3.2. Выведение типов 9.3.3. Методы 9.3.4. Импорт 9.3.5. Циклы и управляющие структуры 9.3.6. Функциональное программирование на Scala 9.4. Объектная модель Scala - знакомая, но своеобразная 9.4.1. Любая сущность - это объект 9.4.2. Конструкторы 9.4.3. Типажи 9.4.4. Одиночка и объект-спутник 9.4.5. Case-классы и сопоставимые выражения 9.4.6. Предостережение 9.5. Структуры данных и коллекции 9.5.1. Список 9.5.2. Словарь 9.5.3. Обобщенные типы 9.6. Знакомство с акторами 9.6.1. Весь код - театр 9.6.2. Обмен информацией с акторами через почтовый ящик 9.7. Резюме Глава 10. Clojure: программирование повышенной надежности 10.1. Введение в Clojure 10.1.1. Hello World на языке Clojure 10.1.2. Знакомство с REPL 10.1.3. Как делаются ошибки 10.1.4. Учимся любить скобки 10.2. Поиск Clojure - синтаксис и семантика 10.2.1. Базовый курс по работе со специальными формами 10.2.2. Списки, векторы, словари и множества 10.2.3. Арифметика, проверка на равенство и другие операции 10.3. Работа с функциями и циклами в Clojure 10.3.1. Простые функции Clojure 10.3.2. Макросы чтения и диспетчеризация 10.3.3. Функциональное программирование и замыкания 10.4. Введение в последовательности Clojure 10.4.1. Ленивые последовательности 10.4.2. Последовательности и функции с переменным количеством аргументов 10.5. Взаимодействие между Clojure и Java 10.5.1. Вызов Java из Clojure 10.5.2. Тип Java у значений Clojure 10.5.3. Использование посредников Clojure 10.5.4. Исследовательское программирование в среде REPL 10.5.5. Использование Clojure из Java 10.6. Параллелизм в Clojure 10.6.1. Функции future и pcall 10.6.2. Ссылки 10.6.3. Агенты 10.7. Резюме Часть 4. Создание многоязычного проекта Глава 11. Разработка через тестирование 11.1. Суть разработки через тестирование 11.1.1. Образец разработки через тестирование с одним случаем использования 11.1.2. Образец разработки через тестирование с несколькими случаями использования 11.1.3. Дальнейшие размышления о цикле «красный - зеленый - рефакторинг» 11.1.4. JUnit 11.2. Тестовые двойники 11.2.1. Пустой объект 11.2.2. Объект-заглушка 11.2.3. Поддельный объект 11.2.4. Подставной объект 11.3. Знакомство со ScalaTest 11.4. Резюме Глава 12. Сборка и непрерывная интеграция 12.1. Знакомство с Maven 3 12.2. Экспресс-проект с Maven 3 12.3. Maven 3 - сборка java7developer 12.3.1. Файл POM 12.3.2. Запуск примеров 12.4. Jenkins - обеспечение непрерывной интеграции 12.4.1. Базовая конфигурация 12.4.2. Настройка задачи 12.4.3. Выполнение задачи 12.5. Параметры кода в Maven и Jenkins 12.5.1. Установка плагинов Jenkins 12.5.2. Обеспечение согласованности кода с помощью плагина Checkstyle 12.5.3. Обеспечение качества кода с помощью FindBugs 12.6. Leiningen 12.6.1. Знакомство с Leiningen 12.6.2. Архитектура Leiningen 12.6.3. Пример: Hello Lein 12.6.4. REPL-ориентированная разработка через тестирование с применением Leiningen 12.6.5. Упаковка и развертывание кода с помощью Leiningen 12.7. Резюме Глава 13. Быстрая веб-разработка 13.1. Проблема с веб-фреймворками на основе Java 13.1.1. Почему компиляция Java не подходит для быстрой веб-разработки 13.1.2. Почему статическая типизация не подходит для быстрой веб-разработки 13.2. Критерии при выборе веб-фреймворка 13.3. Знакомство с Grails 13.4. Экспресс-проект с Grails 13.4.1. Создание объекта предметной области 13.4.2. Разработка через тестирование 13.4.3. Сохраняемость объектов предметной области 13.4.4. Создание тестовых данных 13.4.5. Контроллеры 13.4.6. Виды GSP/JSP 13.4.7. Скаффолдинг и автоматическое создание пользовательского интерфейса 13.4.8. Быстрая циклическая разработка 13.5. Дальнейшее исследование Grails 13.5.1. Логирование 13.5.2. GORM - объектно-реляционное отображение 13.5.3. Плагины Grails 13.6. Знакомство с Compojure 13.6.1. Hello World с Compojure 13.6.2. Ring и маршруты 13.6.3. Hiccup 13.7. Пример проекта с Compojure: «А не выдра ли я?» 13.7.1. Настройка программы «А не выдра ли я?» 13.7.2. Основные функции в программе «А не выдра ли я?» 13.8. Резюме Глава 14. О сохранении основательности 14.1. Чего ожидать в Java 8 14.1.1. Лямбда-выражения (замыкания) 14.1.2. Модуляризация (проект Jigsaw) 14.2. Многоязычное программирование 14.2.1. Межъязыковые взаимодействия и метаобъектные протоколы 14.2.2. Многоязычная модуляризация 14.3. Будущие тенденции параллелизма 14.3.1. Многоядерный мир 14.3.2. Параллельная обработка, управляемая во время исполнения 14.4. Новые направления в развитии виртуальной машины Java 14.4.1. Конвергенция виртуальных машин 14.4.2. Сопрограммы 14.4.3. Кортежи 14.5. Резюме Приложения Приложение A. Установка исходного кода java7developer А.1. Структура исходного кода java7developer А.2. Скачивание и установка Maven А.3. Запуск сборки java7developer А.3.1. Однократная подготовка сборки А.3.2. Очистка А.3.3. Компиляция А.3.4. Тестирование А.4. Резюме Приложение B. Синтаксис и примеры паттернов подстановки B.1. Синтаксис паттернов подстановки B.2. Примеры паттернов подстановки Приложение C. Установка альтернативных языков для виртуальной машины Java C.1. Groovy C.1.1. Скачивание Groovy C.1.2. Установка Groovy C.2. Scala C.3. Clojure C.4. Grails C.4.1. Скачивание Grails C.4.2. Установка Grails Приложение D. Скачивание и установка Jenkins D.1. Загрузка Jenkins D.2. Установка Jenkins D.2.1. Запуск WAR-файла D.2.2. Установка WAR-файла D.2.3. Установка специализированного пакета D.2.4. Первый запуск Jenkins Приложение E. java7developer - Maven POM E.1. Конфигурация сборки E.2. Управление зависимостями