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. Резюме
  • 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. Резюме
  • 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. Резюме
  • 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. Резюме
  • 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. Резюме
  • 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. Резюме
  • 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. Резюме
  • 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. Резюме
  • 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. Резюме
  • 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. Резюме
  • 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. Резюме
  • 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. Резюме
  • 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
  • 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 совершенно бесплатно.
Java. Новое поколение разработки
Рейтинг книги:
0 голосов
3542

Поиск книг:




При поиске учитываются только слова, длина которых больше 3-х символов.

Статистика: