Java. Новое поколение разработки
Бенджамин Эванс, Мартин Вербург
В этой книге представлен оригинальный и практичный взгляд на новые возможности Java 7 и новые языки для виртуальной машины Java (JVM), а также рассмотрены некоторые вспомогательные технологии, необходимые для создания Java-программ завтрашнего дня.
Книга начинается с подробного описания новшеств Java 7, таких как работа с ресурсами в блоке try (конструкция try-with-resources) и новый неблокирующий ввод-вывод (NIO.2). Далее вас ждет экспресс-обзор трех сравнительно новых языков для виртуальной машины Java - Groovy, Scala и Clojure. Вы увидите четкие понятные примеры, которые помогут вам ознакомиться с десятками удобных и практичных приемов. Вы изучите современные методы разработки, обеспечения параллелизма, производительности, а также многие другие интересные темы.
В этой книге:
- новые возможности Java 7;
- вводный курс по работе с языками Groovy, Scala и Clojure;
- обсуждение проблем многоядерной обработки и параллелизма;
- функциональное программирование на новых языках для JVM;
- современные подходы к тестированию, сборке и непрерывной интеграции.
Издательство: Питер, 2014 г.
ISBN 978-5-496-00544-9, 978-1617290060
Количество страниц: 560.
Содержание книги «Java. Новое поколение разработки»:
- 23 Вступление
- 25 Предисловие
- 27 Благодарности
- 27 Лондонское Java-сообщество
- 28 www.coderanch.com
- 28 Manning publications
- 29 Особые благодарности
- 29 Благодарности Бена Эванса
- 30 Благодарности Мартина Вербурга
- 31 Об этой книге
- 32 Как работать с этой книгой
- 33 Для кого предназначена книга
- 33 Дорожная карта
- 34 Соглашения в коде и материал для скачивания
- 35 Требования к программному обеспечению
- 36 Об авторах
- 37 Иллюстрация на обложке
- 38 От издательства
- 41 Часть 1. Разработка на Java 7
- 41 Глава 1. Введение в Java 7
- 42 1.1. Язык и платформа
- 44 1.2. Малое прекрасно — расширения языка Java, или Проект «Монета»
- 47 1.3. Изменения в рамках проекта «Монета»
- 48 1.3.1. Строки в конструкции switch
- 48 1.3.2. Усовершенствованный синтаксис для числовых литералов
- 51 1.3.3. Усовершенствованная обработка исключений
- 53 1.3.4. Использование ресурсов в блоке try (try-with-resources)
- 56 1.3.5. Ромбовидный синтаксис
- 57 1.3.6. Упрощенный вызов методов с переменным количеством аргументов
- 59 1.4. Резюме
- 60 Глава 2. Новый ввод-вывод
- 62 2.1. История ввода-вывода в Java
- 62 2.1.1. Java 1.0–1.3
- 63 2.1.2. Java 1.4 и неблокирующий ввод-вывод
- 64 2.1.3. Введение в NIO.2
- 64 2.2. Path — основа файлового ввода-вывода
- 67 2.2.1. Создание пути
- 68 2.2.2. Получение информации о пути
- 69 2.2.3. Избавление от избыточности
- 70 2.2.4. Преобразование путей
- 71 2.2.5. Пути NIO.2 и класс File, существующий в Java
- 71 2.3. Работа с каталогами и деревьями каталогов
- 72 2.3.1. Поиск файлов в каталоге
- 72 2.3.2. Движение по дереву каталогов
- 74 2.4. Ввод-вывод файловой системы при работе с NIO.2
- 75 2.4.1. Создание и удаление файлов
- 76 2.4.2. Копирование и перемещение файлов
- 77 2.4.3. Атрибуты файлов
- 82 2.4.4. Быстрое считывание и запись данных
- 83 2.4.5. Уведомление об изменении файлов
- 85 2.4.6. SeekableByteChannel
- 85 2.5. Асинхронные операции ввода-вывода
- 86 2.5.1. Стиль с ожиданием
- 89 2.5.2. Стиль с применением обратных вызовов
- 91 2.6. Окончательная шлифовка технологии сокет — канал
- 92 2.6.1. NetworkChannel
- 93 2.6.2. MulticastChannel
- 94 2.7. Резюме
- 62 2.1. История ввода-вывода в Java
- 98 Часть 2. Необходимые технологии
- 98 Глава 3. Внедрение зависимостей
- 99 3.1. Дополнительные знания: понятие об инверсии управления и внедрении зависимостей
- 99 3.1.1. Инверсия управления
- 100 3.1.2. Внедрение зависимостей
- 102 3.1.3. Переход к внедрению зависимостей
- 107 3.2. Стандартизированное внедрение зависимостей в Java
- 109 3.2.1. Аннотация @Inject
- 110 3.2.2. Аннотация @Qualifier
- 111 3.2.3. Аннотация @Named
- 112 3.2.4. Аннотация @Scope
- 113 3.2.5. Аннотация @Singleton
- 113 3.2.6. Интерфейс Provider
- 114 3.3. Guice 3 — эталонная реализация внедрения зависимостей в Java
- 115 3.3.1. Знакомство с Guice
- 118 3.3.2. Морские узлы — различные связи в Guice
- 121 3.3.3. Задание области видимости для внедренных объектов в Guice
- 123 3.4. Резюме
- 99 3.1. Дополнительные знания: понятие об инверсии управления и внедрении зависимостей
- 124 Глава 4. Современная параллельная обработка
- 125 4.1. Теория параллелизма — базовый пример
- 125 4.1.1. Рассмотрение модели потоков в Java
- 127 4.1.2. Структурные концепции
- 128 4.1.3. Как и в каких случаях возникает конфликт
- 129 4.1.4. Источники издержек
- 130 4.1.5. Пример обработчика транзакций
- 131 4.2. Параллельная обработка с блочной структурой (до Java 5)
- 132 4.2.1. Синхронизация и блокировки
- 133 4.2.2. Модель состояния для потока
- 134 4.2.3. Полностью синхронизированные объекты
- 136 4.2.4. Взаимные блокировки
- 138 4.2.5. Почему synchronized?
- 139 4.2.6. Ключевое слово volatile
- 140 4.2.7. Неизменяемость
- 142 4.3. Составные элементы современных параллельных приложений
- 142 4.3.1. Атомарные классы — java.util.concurrent.atomic
- 143 4.3.2. Блокировки — java.util.concurrent.locks
- 147 4.3.3. CountDownLatch
- 149 4.3.4. ConcurrentHashMap
- 150 4.3.5. CopyOnWriteArrayList
- 153 4.3.6. Очереди
- 160 4.4. Контроль исполнения
- 161 4.4.1. Моделирование задач
- 163 4.4.2. ScheduledThreadPoolExecutor
- 164 4.5. Фреймворк fork/join (ветвление/слияние)
- 165 4.5.1. Простой пример fork/join
- 168 4.5.2. ForkJoinTask и захват работы
- 168 4.5.3. Параллелизация проблем
- 169 4.6. Модель памяти языка Java (JMM)
- 172 4.7. Резюме
- 125 4.1. Теория параллелизма — базовый пример
- 173 Глава 5. Файлы классов и байт-код
- 174 5.1. Загрузка классов и объекты классов
- 174 5.1.1. Обзор — загрузка и связывание
- 177 5.1.2. Объекты классов
- 177 5.1.3. Загрузчики классов
- 179 5.1.4. Пример — загрузчики классов при внедрении зависимостей
- 181 5.2. Использование дескрипторов методов
- 182 5.2.1. MethodHandle
- 182 5.2.2. MethodType
- 183 5.2.3. Поиск дескрипторов методов
- 184 5.2.4. Пример: сравнение рефлексии, использования посредников и дескрипторов методов
- 187 5.2.5. Почему стоит выбирать дескрипторы методов
- 188 5.3. Исследование файлов классов
- 189 5.3.1. Знакомство с javap
- 189 5.3.2. Внутренняя форма сигнатур методов
- 191 5.3.3. Пул констант
- 193 5.4. Байт-код
- 194 5.4.1. Пример: дизассемблирование класса
- 196 5.4.2. Среда времени исполнения
- 197 5.4.3. Введение в коды операций
- 198 5.4.4. Коды операций для загрузки и сохранения
- 199 5.4.5. Арифметические коды операций
- 200 5.4.6. Коды операций для контроля исполнения
- 201 5.4.7. Коды операций для активизации
- 201 5.4.8. Коды операций для работы с платформой
- 202 5.4.9. Сокращенные формы записи кодов операций
- 202 5.4.10. Пример: сцепление (конкатенация) строк
- 204 5.5. invokedynamic
- 205 5.5.1. Как работает invokedynamic
- 206 5.5.2. Пример: дизассемблирование invokedynamic-вызова
- 207 5.6. Резюме
- 174 5.1. Загрузка классов и объекты классов
- 209 Глава 6. Понятие о повышении производительности
- 211 6.1. Терминологическое описание производительности — базовые определения
- 211 6.1.1. Ожидание
- 212 6.1.2. Пропускная способность
- 212 6.1.3. Коэффициент использования
- 213 6.1.4. Эффективность
- 213 6.1.5. Мощность
- 213 6.1.6. Масштабируемость
- 213 6.1.7. Деградация
- 214 6.2. Прагматический подход к анализу производительности
- 215 6.2.1. Знайте, что именно вы измеряете
- 216 6.2.2. Умейте проводить измерения
- 217 6.2.3. Знайте, какого уровня производительности вы хотите достичь
- 218 6.2.4. Знайте, когда следует прекратить оптимизацию
- 218 6.2.5. Знайте, какой ценой дается повышение производительности
- 219 6.2.6. Знайте об опасности поспешной оптимизации
- 220 6.3. Что пошло не так? И почему нас это должно волновать?
- 221 6.3.1. Закон Мура: прошлые и будущие тенденции изменения производительности
- 222 6.3.2. Понятие об иерархии латентности памяти
- 224 6.3.3. Почему так сложно выполнять оптимизацию производительности в Java
- 225 6.4. Вопрос времени — от железа и вверх
- 225 6.4.1. Аппаратные часы
- 226 6.4.2. Проблема с nanoTime()
- 229 6.4.3. Роль времени при повышении производительности
- 230 6.4.4. Практический пример: понятие о кэш-промахах
- 232 6.5. Сборка мусора
- 233 6.5.1. Основы
- 234 6.5.2. Отслеживание и очистка
- 236 6.5.3. jmap
- 241 6.5.4. Полезные переключатели виртуальной машины Java
- 242 6.5.5. Чтение журналов сборщика мусора
- 243 6.5.6. Визуализация использования памяти с помощью VisualVM
- 246 6.5.7. Анализ локальности
- 248 6.5.8. Параллельное отслеживание и очистка
- 249 6.5.9. G1 — новый сборщик мусора для Java
- 250 6.6. Динамическая компиляция с применением HotSpot
- 252 6.6.1. Знакомство с HotSpot
- 254 6.6.2. Встраиваемая подстановка методов
- 255 6.6.3. Динамическая компиляция и мономорфные вызовы
- 255 6.6.4. Чтение журналов компиляции
- 257 6.7. Резюме
- 211 6.1. Терминологическое описание производительности — базовые определения
- 262 Часть 3. Многоязычное программирование на виртуальной машине Java
- 262 Глава 7. Альтернативные языки для виртуальной машины Java
- 263 7.1. Языку Java недостает гибкости? Это провокация!
- 263 7.1.1. Система согласования
- 265 7.1.2. Концептуальные основы функционального программирования
- 266 7.1.3. Идиомы словаря и фильтра
- 268 7.2. Языковой зоопарк
- 269 7.2.1. Сравнение интерпретируемых и компилируемых языков
- 269 7.2.2. Сравнение динамической и статической типизации
- 270 7.2.3. Сравнение императивных и функциональных языков
- 271 7.2.4. Сравнение повторной реализации и оригинала
- 272 7.3. Многоязычное программирование на виртуальной машине Java
- 274 7.3.1. Зачем использовать другой язык вместо Java
- 275 7.3.2. Многообещающие языки
- 276 7.4. Как подобрать для проекта другой язык вместо Java
- 277 7.4.1. Высоки ли риски в области проекта
- 278 7.4.2. Насколько хорошо язык взаимодействует с Java
- 278 7.4.3. Имеется ли хороший инструментарий и поддержка данного языка на уровне тестов
- 279 7.4.4. Насколько сложно выучить данный язык
- 279 7.4.5. Насколько много разработчиков использует данный язык
- 280 7.5. Как виртуальная машина Java поддерживает альтернативные языки
- 281 7.5.1. Среда времени исполнения для не Java-языков
- 281 7.5.2. Фикции компилятора
- 284 7.6. Резюме
- 263 7.1. Языку Java недостает гибкости? Это провокация!
- 285 Глава 8. Groovy — динамический приятель Java
- 287 8.1. Знакомство с Groovy
- 288 8.1.1. Компиляция и запуск
- 289 8.1.2. Консоль Groovy
- 290 8.2. Groovy 101 — синтаксис и семантика
- 291 8.2.1. Стандартный импорт
- 292 8.2.2. Числовая обработка
- 293 8.2.3. Переменные, сравнение динамических и статических типов, а также контекст
- 295 8.2.4. Синтаксис списков и словарей
- 296 8.3. Отличия от Java — ловушки для новичков
- 297 8.3.1. Опциональные точки с запятой и операторы возврата
- 297 8.3.2. Опциональные скобки для параметров методов
- 298 8.3.3. Модификаторы доступа
- 298 8.3.4. Обработка исключений
- 299 8.3.5. Оператор равенства в Groovy
- 299 8.3.6. Внутренние классы
- 300 8.4. Функции Groovy, пока отсутствующие в Java
- 300 8.4.1. GroovyBeans
- 301 8.4.2. Оператор безопасного разыменования
- 302 8.4.3. Оператор Элвис
- 303 8.4.4. Улучшенные строки
- 304 8.4.5. Функциональные литералы
- 305 8.4.6. Первоклассная поддержка для операций с коллекциями
- 307 8.4.7. Первоклассная поддержка работы с регулярными выражениями
- 308 8.4.8. Простая XML-обработка
- 310 8.5. Взаимодействие между Groovy и Java
- 311 8.5.1. Вызов Java из Groovy
- 311 8.5.2. Вызов Groovy из Java
- 315 8.6. Резюме
- 287 8.1. Знакомство с Groovy
- 316 Глава 9. Язык Scala — мощный и лаконичный
- 317 9.1. Быстрый обзор Scala
- 317 9.1.1. Scala — лаконичный язык
- 320 9.1.2. Сопоставимые выражения
- 322 9.1.3. Case-классы
- 324 9.1.4. Акторы
- 325 9.2. Подходит ли Scala для моего проекта?
- 325 9.2.1. Сравнение Scala и Java
- 326 9.2.2. Когда и каким образом приступать к использованию Scala
- 327 9.2.3. Признаки, указывающие, что Scala может не подойти для вашего проекта
- 327 9.3. Как вновь сделать код красивым с помощью Scala
- 328 9.3.1. Использование компилятора и REPL
- 329 9.3.2. Выведение типов
- 330 9.3.3. Методы
- 331 9.3.4. Импорт
- 332 9.3.5. Циклы и управляющие структуры
- 333 9.3.6. Функциональное программирование на Scala
- 334 9.4. Объектная модель Scala — знакомая, но своеобразная
- 335 9.4.1. Любая сущность — это объект
- 336 9.4.2. Конструкторы
- 337 9.4.3. Типажи
- 339 9.4.4. Одиночка и объект-спутник
- 342 9.4.5. Case-классы и сопоставимые выражения
- 344 9.4.6. Предостережение
- 345 9.5. Структуры данных и коллекции
- 346 9.5.1. Список
- 350 9.5.2. Словарь
- 351 9.5.3. Обобщенные типы
- 354 9.6. Знакомство с акторами
- 355 9.6.1. Весь код — театр
- 356 9.6.2. Обмен информацией с акторами через почтовый ящик
- 358 9.7. Резюме
- 317 9.1. Быстрый обзор Scala
- 359 Глава 10. Clojure: программирование повышенной надежности
- 360 10.1. Введение в Clojure
- 361 10.1.1. Hello World на языке Clojure
- 362 10.1.2. Знакомство с REPL
- 363 10.1.3. Как делаются ошибки
- 363 10.1.4. Учимся любить скобки
- 364 10.2. Поиск Clojure — синтаксис и семантика
- 365 10.2.1. Базовый курс по работе со специальными формами
- 366 10.2.2. Списки, векторы, словари и множества
- 369 10.2.3. Арифметика, проверка на равенство и другие операции
- 370 10.3. Работа с функциями и циклами в Clojure
- 370 10.3.1. Простые функции Clojure
- 373 10.3.2. Макросы чтения и диспетчеризация
- 375 10.3.3. Функциональное программирование и замыкания
- 377 10.4. Введение в последовательности Clojure
- 379 10.4.1. Ленивые последовательности
- 380 10.4.2. Последовательности и функции с переменным количеством аргументов
- 382 10.5. Взаимодействие между Clojure и Java
- 382 10.5.1. Вызов Java из Clojure
- 383 10.5.2. Тип Java у значений Clojure
- 384 10.5.3. Использование посредников Clojure
- 385 10.5.4. Исследовательское программирование в среде REPL
- 386 10.5.5. Использование Clojure из Java
- 386 10.6. Параллелизм в Clojure
- 387 10.6.1. Функции future и pcall
- 389 10.6.2. Ссылки
- 393 10.6.3. Агенты
- 394 10.7. Резюме
- 360 10.1. Введение в Clojure
- 397 Часть 4. Создание многоязычного проекта
- 397 Глава 11. Разработка через тестирование
- 399 11.1. Суть разработки через тестирование
- 400 11.1.1. Образец разработки через тестирование с одним случаем использования
- 405 11.1.2. Образец разработки через тестирование с несколькими случаями использования
- 408 11.1.3. Дальнейшие размышления о цикле «красный — зеленый — рефакторинг»
- 410 11.1.4. JUnit
- 412 11.2. Тестовые двойники
- 413 11.2.1. Пустой объект
- 415 11.2.2. Объект-заглушка
- 419 11.2.3. Поддельный объект
- 425 11.2.4. Подставной объект
- 427 11.3. Знакомство со ScalaTest
- 429 11.4. Резюме
- 399 11.1. Суть разработки через тестирование
- 431 Глава 12. Сборка и непрерывная интеграция
- 434 12.1. Знакомство с Maven 3
- 435 12.2. Экспресс-проект с Maven 3
- 438 12.3. Maven 3 — сборка java7developer
- 438 12.3.1. Файл POM
- 445 12.3.2. Запуск примеров
- 448 12.4. Jenkins — обеспечение непрерывной интеграции
- 450 12.4.1. Базовая конфигурация
- 452 12.4.2. Настройка задачи
- 455 12.4.3. Выполнение задачи
- 457 12.5. Параметры кода в Maven и Jenkins
- 458 12.5.1. Установка плагинов Jenkins
- 459 12.5.2. Обеспечение согласованности кода с помощью плагина Checkstyle
- 461 12.5.3. Обеспечение качества кода с помощью FindBugs
- 464 12.6. Leiningen
- 465 12.6.1. Знакомство с Leiningen
- 465 12.6.2. Архитектура Leiningen
- 466 12.6.3. Пример: Hello Lein
- 469 12.6.4. REPL-ориентированная разработка через тестирование с применением Leiningen
- 471 12.6.5. Упаковка и развертывание кода с помощью Leiningen
- 472 12.7. Резюме
- 474 Глава 13. Быстрая веб-разработка
- 475 13.1. Проблема с веб-фреймворками на основе Java
- 476 13.1.1. Почему компиляция Java не подходит для быстрой веб-разработки
- 477 13.1.2. Почему статическая типизация не подходит для быстрой веб-разработки
- 478 13.2. Критерии при выборе веб-фреймворка
- 480 13.3. Знакомство с Grails
- 481 13.4. Экспресс-проект с Grails
- 483 13.4.1. Создание объекта предметной области
- 483 13.4.2. Разработка через тестирование
- 486 13.4.3. Сохраняемость объектов предметной области
- 487 13.4.4. Создание тестовых данных
- 488 13.4.5. Контроллеры
- 489 13.4.6. Виды GSP/JSP
- 491 13.4.7. Скаффолдинг и автоматическое создание пользовательского интерфейса
- 492 13.4.8. Быстрая циклическая разработка
- 492 13.5. Дальнейшее исследование Grails
- 493 13.5.1. Логирование
- 493 13.5.2. GORM — объектно-реляционное отображение
- 494 13.5.3. Плагины Grails
- 495 13.6. Знакомство с Compojure
- 496 13.6.1. Hello World с Compojure
- 499 13.6.2. Ring и маршруты
- 500 13.6.3. Hiccup
- 500 13.7. Пример проекта с Compojure: «А не выдра ли я?»
- 502 13.7.1. Настройка программы «А не выдра ли я?»
- 504 13.7.2. Основные функции в программе «А не выдра ли я?»
- 507 13.8. Резюме
- 475 13.1. Проблема с веб-фреймворками на основе Java
- 509 Глава 14. О сохранении основательности
- 509 14.1. Чего ожидать в Java 8
- 510 14.1.1. Лямбда-выражения (замыкания)
- 512 14.1.2. Модуляризация (проект Jigsaw)
- 514 14.2. Многоязычное программирование
- 515 14.2.1. Межъязыковые взаимодействия и метаобъектные протоколы
- 516 14.2.2. Многоязычная модуляризация
- 517 14.3. Будущие тенденции параллелизма
- 517 14.3.1. Многоядерный мир
- 518 14.3.2. Параллельная обработка, управляемая во время исполнения
- 519 14.4. Новые направления в развитии виртуальной машины Java
- 520 14.4.1. Конвергенция виртуальных машин
- 521 14.4.2. Сопрограммы
- 522 14.4.3. Кортежи
- 525 14.5. Резюме
- 509 14.1. Чего ожидать в Java 8
- 528 Приложения
- 528 Приложение A. Установка исходного кода java7developer
- 528 А.1. Структура исходного кода java7developer
- 530 А.2. Скачивание и установка Maven
- 532 А.3. Запуск сборки java7developer
- 532 А.3.1. Однократная подготовка сборки
- 533 А.3.2. Очистка
- 534 А.3.3. Компиляция
- 535 А.3.4. Тестирование
- 536 А.4. Резюме
- 537 Приложение B. Синтаксис и примеры паттернов подстановки
- 537 B.1. Синтаксис паттернов подстановки
- 537 B.2. Примеры паттернов подстановки
- 539 Приложение C. Установка альтернативных языков для виртуальной машины Java
- 539 C.1. Groovy
- 539 C.1.1. Скачивание Groovy
- 540 C.1.2. Установка Groovy
- 542 C.2. Scala
- 543 C.3. Clojure
- 543 C.4. Grails
- 543 C.4.1. Скачивание Grails
- 544 C.4.2. Установка Grails
- 539 C.1. Groovy
- 547 Приложение D. Скачивание и установка Jenkins
- 547 D.1. Загрузка Jenkins
- 547 D.2. Установка Jenkins
- 548 D.2.1. Запуск WAR-файла
- 548 D.2.2. Установка WAR-файла
- 548 D.2.3. Установка специализированного пакета
- 548 D.2.4. Первый запуск Jenkins
- 550 Приложение E. java7developer — Maven POM
- 550 E.1. Конфигурация сборки
- 554 E.2. Управление зависимостями
Инструкция как скачать книгу Бенджамин Эванс, Мартин Вербург: Java. Новое поколение разработки в форматах DjVu, PDF, DOC или fb2 совершенно бесплатно.