Java для опытных разработчиков. 2 изд

Java для опытных разработчиков. 2 изд

Java для опытных разработчиков. 2 изд
Автор: Кларк Джейсон, Фербург Мартин, Эванс Бенджамин
Дата выхода: 2024
Издательство: Питер
Количество страниц: 736
Размер файла: 4.7 MB
Тип файла: PDF
Добавил: codelibs
 Проверить на вирусы

Отзывы о первом издании....21

Предисловие....22

Введение....24

Благодарности....27

Об этой книге....30

Для кого эта книга....30

Как использовать эту книгу....31

О коде....32

Форум liveBook....33

Другие сетевые ресурсы....33

Об авторах....34

Иллюстрация на обложке....35

От издательства....36

Часть I От 8 до 11 и дальше....37

Глава 1. Современный язык Java....38

1.1. Язык и платформа....39

1.2. Новый цикл выпуска Java....41

1.3. Расширенное выведение типов (синтаксис var)....45

1.4. Изменения языка и платформы....49

1.4.1. Синтаксический сахар....50

1.4.2. Изменения языка....50

1.4.3. Документы JSR и JEP....51

1.4.4. Инкубационная и предварительная функциональность....52

1.5. Небольшие изменения в Java 11....53

1.5.1. Фабрики коллекций (JEP 213)....53

1.5.2. Удаление корпоративных модулей (JEP 320)....55

1.5.3. HTTP/2 (Java 11)....56

1.5.4. Однофайловое выполнение (JEP 330)....61

Итоги....63

Глава 2. Модули Java....64

2.1. Модули Java: общая картина....65

2.1.1. Проект Jigsaw....66

2.1.2. Граф модулей....69

2.1.3. Защита внутреннего устройства....71

2.1.4. Новая семантика управления доступом....72

2.2. Основы синтаксиса модулей....73

2.2.1. exports и requires....75

2.2.2. Транзитивность....76

2.3. Загрузка модулей....77

2.3.1. Платформенные модули....78

2.3.2. Прикладные модули....78

2.3.3. Автоматические модули....79

2.3.4. Анонимные модули....79

2.4. Создание первого модульного приложения....80

2.4.1. Параметры командной строки для модулей....81

2.4.2. Выполнение модульного приложения....83

2.4.3. Модули и рефлексия....85

2.5. Проектирование архитектуры для модулей....86

2.5.1. Расщепленные пакеты....87

2.5.2. Компактные профили Java 8....88

2.5.3. Многоверсионные файлы JAR....90

2.6. Не только модули....93

Итоги....95

Глава 3. Java 17....97

3.1. Текстовые блоки....97

3.2. Выражения switch....99

3.3. Записи....103

3.3.1. Номинативная типизация....109

3.3.2. Компактные конструкторы записей....110

3.4. Запечатанные типы....113

3.5. Новая форма instanceof....118

3.6. Сопоставление с шаблонами и предварительная функциональность....119

Итоги....122

Часть II Что там внутри?....123

Глава 4. Файлы классов и байт-код....124

4.1. Загрузка классов и объекты классов....125

4.1.1. Загрузка и компоновка....126

4.1.2. Объекты Class....129

4.2. Загрузчики классов....130

4.2.1. Нестандартная загрузка классов....132

4.2.2. Модули и загрузка классов....140

4.3. Анализ файлов классов....140

4.3.1. Введение в javap....141

4.3.2. Внутренняя форма сигнатур методов....141

4.3.3. Пул констант....143

4.4. Байт-код....146

4.4.1. Дизассемблирование классов....146

4.4.2. Среда выполнения....149

4.4.3. Введение в коды операций....150

4.4.4. Операции загрузки и сохранения....152

4.4.5. Арифметические операции....153

4.4.6. Операции управления порядком выполнения....154

4.4.7. Операции вызова....155

4.4.8. Платформенные операции....158

4.4.9. Сокращенные формы кодов операций....159

4.5. Рефлексия....159

4.5.1. Введение в рефлексию....160

4.5.2. Загрузка классов в сочетании с рефлексией....163

4.5.3. Проблемы с рефлексией....163

Итоги....165

Глава 5. Основы конкурентности в Java....166

5.1. Краткий курс конкурентности....167

5.1.1. Но я уже знаю о Thread....167

5.1.2. Оборудование....168

5.1.3. Закон Амдала....169

5.1.4. Потоковая модель Java....170

5.1.5. Полезный опыт....171

5.2. Факторы проектирования....172

5.2.1. Безопасность и конкурентная типобезопасность....172

5.2.2. Живость....173

5.2.3. Производительность....174

5.2.4. Повторное использование....174

5.2.5. Как и почему возникают конфликты между факторами?....174

5.2.6. Источники затрат....175

5.3. Конкурентное выполнение с блоковой структурой (до Java 5)....176

5.3.1. Синхронизация и блокировки....176

5.3.2. Модель состояний потока....178

5.3.3. Полностью синхронизированные объекты....180

5.3.4. Взаимная блокировка....181

5.3.5. Почему synchronized?....184

5.3.6. Ключевое слово volatile....186

5.3.7. Состояния и методы потока....187

5.3.8. Неизменяемость....193

5.4. Модель памяти Java (JMM)....197

5.5. Конкурентность в байт-коде....200

5.5.1. Потерянное обновление....201

5.5.2. Синхронизация в байт-коде....204

5.5.3. Синхронизированные методы....208

5.5.4. Несинхронизированное чтение....209

5.5.5. Снова о взаимной блокировке....211

5.5.6. Снова об устранении взаимных блокировок....213

5.5.7. Обращения к volatile....218

Итоги....220

Глава 6. Конкурентные библиотеки Java....221

6.1. Структурные элементы современных конкурентных приложений....221

6.2. Атомарные классы....222

6.3. Классы Lock....224

6.3.1. Объекты условий....226

6.4. CountDownLatch....226

6.5. ConcurrentHashMap....228

6.5.1. Упрощенное представление HashMap....228

6.5.2. Ограничения Dictionary....232

6.5.3. Конкурентная реализация Dictionary....232

6.5.4. ConcurrentHashMap....235

6.6. CopyOnWriteArrayList....238

6.7. Блокирующие очереди....241

6.7.1. Интерфейсы BlockingQueue....247

6.7.2. WorkUnit....249

6.8. Преднамеченные объекты....250

6.8.1. CompletableFuture....252

6.9. Задачи и выполнение....254

6.9.1. Моделирование задач....255

6.9.2. Исполнители....256

6.9.3. Однопоточный исполнитель....257

6.9.4. Пул фиксированного размера....258

6.9.5. Пул потоков с кэшированием....259

6.9.6. ScheduledThreadPoolExecutor....260

Итоги....261

Глава 7. Производительность кода на Java....262

7.1. Терминология производительности: основные определения....265

7.1.1. Задержка....265

7.1.2. Пропускная способность....265

7.1.3. Загруженность....266

7.1.4. Эффективность....266

7.1.5. Емкость....267

7.1.6. Масштабируемость....267

7.1.7. Деградация....267

7.2. Прагматичный подход к анализу производительности....268

7.2.1. Понимайте, что измеряете....268

7.2.2. Как выполнять измерения....269

7.2.3. Установите цели по быстродействию....271

7.2.4. Знайте, когда остановиться....271

7.2.5. Учитывайте цену повышения быстродействия....272

7.2.6. Преждевременная оптимизация опасна....272

7.3. Что пошло не так? Почему мы должны этим заниматься?....274

7.3.1. Закон Мура....274

7.3.2. Иерархия задержек памяти....276

7.4. Почему так сложно оптимизировать производительность кода на Java?....278

7.4.1. Роль времени в оптимизации производительности....279

7.4.2. Промахи кэша....280

7.5. Сборка мусора....282

7.5.1. Основы....282

7.5.2. Пометка и очистка....283

7.5.3. Области памяти....285

7.5.4. Сборка мусора в молодом поколении....286

7.5.5. Полная сборка мусора....286

7.5.6. Безопасные точки....286

7.5.7. G1: сборщик мусора по умолчанию в Java....287

7.5.8. Сборщик мусора Parallel....289

7.5.9. Параметры конфигурации сборщика мусора....290

7.6. JIT-компиляция с HotSpot....292

7.6.1. Зачем нужна динамическая компиляция?....293

7.6.2. Введение в HotSpot....293

7.6.3. Встраивание методов....295

7.6.4. Динамическая компиляция и мономорфные вызовы....295

7.6.5. Чтение журналов компиляции....296

7.6.6. Деоптимизация....297

7.7. JDK Flight Recorder....298

7.7.1. Flight Recorder....298

7.7.2. Mission Control....300

Итоги....306

Часть III Другие языки на JVM....307

Глава 8. Альтернативные языки на JVM....308

8.1. Классификация языков....309

8.1.1. Интерпретируемые и компилируемые языки....309

8.1.2. Динамическая и статическая типизация....310

8.1.3. Императивные и функциональные языки....311

8.1.4. Оригинал и повторная реализация....312

8.2. Многоязычное программирование на JVM....314

8.2.1. Зачем нужны другие языки?....315

8.2.2. Перспективные языки....317

8.2.3. Языки, которые мы могли выбрать (но не выбрали)....318

8.3. Как выбрать альтернативный язык для проекта....320

8.3.1. Является ли область проекта низкорискованной?....321

8.3.2. Насколько просто язык взаимодействует с Java?....322

8.3.3. Насколько развита инструментальная и тестовая поддержка для языка?....323

8.3.4. Легко ли изучить язык?....323

8.3.5. Насколько популярен этот язык среди разработчиков?....324

8.4. Как JVM поддерживает альтернативные языки....324

8.4.1. Производительность....325

8.4.2. Среды выполнения для альтернативных языков....326

8.4.3. Фикции компилятора....326

Итоги....328

Глава 9. Kotlin....329

9.1. Почему стоит использовать Kotlin....330

9.1.1. Установка....330

9.2. Удобство и компактность....330

9.2.1. Начиная с меньшего....331

9.2.2. Переменные....331

9.2.3. Проверка равенства....332

9.2.4. Функции....333

9.2.5. Коллекции....336

9.2.6. Выражения....339

9.3. Новый взгляд на классы и объекты....341

9.3.1. Классы данных....347

9.4. Безопасность....348

9.4.1. Null-безопасность....348

9.4.2. Умное приведение типа....350

9.5. Конкурентность....352

9.6. Совместимость с Java....355

Итоги....359

Глава 10. Clojure: другой взгляд на программирование....360

10.1. Введение в Clojure....361

10.1.1. Программа «Hello World» на Clojure....363

10.1.2. Основы работы с REPL....365

10.1.3. Ошибки....367

10.1.4. Привыкаем к круглым скобкам....370

10.2. Clojure: синтаксис и семантика....371

10.2.1. Краткий курс специальных форм....371

10.2.2. Списки, векторы, отображения и множества....374

10.2.3. Арифметические действия, проверка равенства и другие операции....378

10.2.4. Работа с функциями в Clojure....379

10.2.5. Циклы в Clojure....383

10.2.6. Макросы считывателя и диспетчеризация....384

10.3. Функциональное программирование и замыкания....386

10.4. Знакомство с последовательностями Clojure....388

10.4.1. Последовательности и функции переменной арности....393

10.5. Взаимодействие между Clojure и Java....394

10.5.1. Вызов Java из Clojure....395

10.5.2. Как устроены вызовы Clojure....396

10.5.3. Тип Java для значений Clojure....396

10.5.4. Заместители в Clojure....397

10.5.5. Исследовательское программирование в REPL....398

10.5.6. Использование Clojure из Java....399

10.6. Макросы....400

Итоги....406

Часть IV Сборка и развертывание....407

Глава 11. Сборка в Gradle и Maven....408

11.1. Почему средства сборки важны для опытного разработчика....408

11.1.1. Автоматизация рутинных операций....409

11.1.2. Управление зависимостями....409

11.1.3. Согласование усилий разработчиков....413

11.2. Maven....414

11.2.1. Жизненный цикл сборки....414

11.2.2. Команды и знакомство с POM....415

11.2.3. Сборка....417

11.2.4. Управление манифестом....418

11.2.5. Добавление нового языка....419

11.2.6. Тестирование....422

11.2.7. Управление зависимостями....425

11.2.8. Анализ покрытия....429

11.2.9. За пределами Java 8....430

11.2.10. Многоверсионные файлы JAR в Maven....431

11.2.11. Maven и модули....435

11.2.12. Разработка плагинов для Maven....438

11.3. Gradle....441

11.3.1. Установка Gradle....442

11.3.2. Задачи....443

11.3.3. Сценарии сборки....444

11.3.4. Использование плагинов....445

11.3.5. Сборка....445

11.3.6. Эффективность....448

11.3.7. Зависимости в Gradle....449

11.3.8. Добавление кода на Kotlin....454

11.3.9. Тестирование....455

11.3.10. Автоматизация статического анализа....456

11.3.11. За пределами Java 8....457

11.3.12. Gradle и модули....458

11.3.13. Настройка Gradle....465

Итоги....467

Глава 12. Выполнение Java в контейнерах....469

12.1. Почему контейнеры важны для опытных разработчиков....470

12.1.1. Управляющие операционные системы, виртуальные машины и контейнеры....470

12.1.2. Преимущества контейнеров....473

12.1.3. Недостатки контейнеров....474

12.2. Основы работы с Docker....475

12.2.1. Построение образов Docker....475

12.2.2. Запуск контейнеров Docker....478

12.3. Разработка приложений на Java с Docker....480

12.3.1. Выбор базового образа....481

12.3.2. Сборка образа в Gradle....482

12.3.3. Сборка в Docker....483

12.3.4. Порты и узлы....486

12.3.5. Локальная разработка с Docker Compose....488

12.3.6. Отладка в Docker....491

12.3.7. Протоколирование в Docker....493

12.4. Kubernetes....495

12.5. Наблюдаемость и производительность....503

12.5.1. Наблюдаемость....503

12.5.2. Производительность в контейнерах....506

Итоги....507

Глава 13. Основы тестирования....509

13.1. Зачем нужно тестирование....509

13.2. Как проводить тестирование....510

13.3. Разработка через тестирование....514

13.3.1. TDD в двух словах....516

13.3.2. Пример TDD с одним сценарием использования....516

13.4. Тестовые дублеры....522

13.4.1. Пустышка....523

13.4.2. Заглушка....525

13.4.3. Суррогаты....527

13.4.4. Макеты....530

13.4.5. Проблемы с макетами....531

13.5. От JUnit 4 к 5....533

Итоги....539

Глава 14. Тестирование за пределами JUnit....540

14.1. Интеграционное тестирование с Testcontainers....540

14.1.1. Установка testcontainers....541

14.1.2. Пример с Redis....541

14.1.3. Получение логов контейнеров....545

14.1.4. Пример с Postgres....546

14.1.5. Пример сквозного тестирования с Selenium....548

14.2. Спецификационное тестирование в Spek и Kotlin....550

14.3. Тестирование на основе свойств в Clojure....556

14.3.1. clojure.test....556

14.3.2. clojure.spec....558

14.3.3. test.check....561

14.3.4. clojure.spec и test.check....567

Итоги....568

Часть V Передовые рубежи Java....569

Глава 15. Продвинутое функциональное программирование....570

15.1. Введение в понятия функционального программирования....571

15.1.1. Чистые функции....571

15.1.2. Неизменяемость....571

15.1.3. Функции высшего порядка....572

15.1.4. Рекурсия....573

15.1.5. Замыкания....574

15.1.6. Отложенные вычисления....574

15.1.7. Каррирование и частичное применение....575

15.2. Ограничения функционального программирования на Java....576

15.2.1. Чистые функции....576

15.2.2. Изменяемость....577

15.2.3. Функции высшего порядка....579

15.2.4. Рекурсия....580

15.2.5. Замыкания....583

15.2.6. Отложенные вычисления....585

15.2.7. Каррирование и частичное применение....587

15.2.8. Система типов Java и коллекции....588

15.3. Функциональное программирование на Kotlin....590

15.3.1. Чистые функции и функции высшего порядка....590

15.3.2. Замыкания....591

15.3.3. Каррирование и частичное применение....592

15.3.4. Неизменяемость....593

15.3.5. Хвостовая рекурсия....596

15.3.6. Отложенное вычисление....600

15.3.7. Последовательности....601

15.4. Функциональное программирование на Clojure....606

15.4.1. Включения....606

15.4.2. Отложенные последовательности....607

15.4.3. Каррирование в Clojure....610

Итоги....611

Глава 16. Продвинутое конкурентное программирование....612

16.1. Фреймворк Fork/Join....613

16.1.1. Простой пример F/J....614

16.1.2. Параллелизация задач для F/J....617

16.1.3. Алгоритмы перехвата работы....618

16.2. Конкурентность и функциональное программирование....620

16.2.1. Снова о CompletableFuture....620

16.2.2. Параллельные потоки данных....624

16.3. Как работают корутины Kotlin....626

16.3.1. Как работают корутины....626

16.3.2. Области видимости и диспетчеризация корутин....631

16.4. Конкурентное выполнение в Clojure....633

16.4.1. Перманентные структуры данных....634

16.4.2. Преднамеченные объекты и pcalls....641

16.4.3. Программная транзакционная память....643

16.4.4. Агенты....647

Итоги....648

Глава 17. Внутреннее устройство современной JVM....649

17.1. Знакомство с внутренним устройством JVM: вызов методов....650

17.1.1. Вызов виртуальных методов....650

17.1.2. Вызов методов интерфейсов....653

17.1.3. Вызов «специальных» методов....655

17.1.4. Конечные методы....656

17.2. Внутренняя реализация рефлексии....657

17.3. Дескрипторы методов....661

17.3.1. MethodHandle....662

17.3.2. MethodType....663

17.3.3. Как получать дескрипторы методов....664

17.3.4. Рефлексия, заместители и дескрипторы методов....665

17.4. invokedynamic....668

17.4.1. Реализация лямбда-выражений....670

17.5. Небольшие внутренние изменения....673

17.5.1. Конкатенация строк....673

17.5.2. Компактные строки....675

17.5.3. Общие контексты....677

17.6. Unsafe....680

17.7. Замена Unsafe поддерживаемыми API....684

17.7.1. VarHandle....685

17.7.2. Скрытые классы....687

Итоги....689

Глава 18. Будущее Java....690

18.1. Проект Amber....691

18.2. Проект Panama....693

18.2.1. API внешних функций и памяти....693

18.3. Проект Loom....700

18.3.1. Виртуальные потоки....704

18.3.2. Строители потоков....705

18.3.3. Программирование с помощью виртуальных потоков....706

18.3.4. Когда проект Loom станет доступным?....708

18.4. Проект Valhalla....709

18.4.1. Изменение модели языка....713

18.4. Последствия внедрения объектов-значений....714

18.4.3. Снова об обобщениях....717

18.5. Java 18....718

Итоги....718

Приложения....721

Приложение А. Выбор версии Java....722

A.1. Java остается бесплатным....722

A.1.1. Java SE / OpenJDK / Сборки Oracle OpenJDK / Oracle JDK....722

A.2. Для тех, кто остается на Java SE 8....723

A.2.1. Бесплатное использование Java SE 8....723

A.3. Как получить Java SE 11....723

A.3.1. Бесплатное использование Java SE 11....724

A.4. Как получить Java SE 17 (LTS)....724

A.4.1. Бесплатное использование Java SE 17....724

A.5. Платная поддержка....724

Приложение Б. Потоки данных в Java 8....725

Б.1. Обратная совместимость....725

Б.2. Методы по умолчанию....726

Б.3. Потоки данных....727

Б.3.1. Пример....728

Б.4. Ограничения коллекций....731

Б.5. Бесконечные потоки данных....732

Б.6. Работа с примитивами....732

Б.7. Параллельные операции?....733

Язык Java – сердце корпоративного ПО. Если программист хорошо знает Java, он без особого труда найдет интересную работу. Поднимите ваши навыки Java на новый уровень вместе с экспертами. Основательно изучите такие мощные инструменты, как модели конкурентного выполнения и модули, и даже раскройте некоторые глубинные тайны Java.Узнайте, как Java работает на уровне байт-кода. Освойте ценные приемы конкурентного выполнения и оптимизации быстродействия, а еще ключевые методы сборки, тестирования и развертывания. Также рассмотрите альтернативные языки для JVM – Kotlin и Clojure. Изучив материал, вы будете выделяться на фоне других разработчиков!


Похожее:

Список отзывов:

Нет отзывов к книге.