Говоря о третьем издании книги Эффективное программирование на Java, третье издание, достаточно упомянуть его автора — Джошуа Блоха — и это будет наилучшей ее рекомендацией.
Книга представляет собой овеществленный опыт ее автора как программиста на Java. Новые возможности этого языка программирования, появившиеся в версиях, вышедших со времен предыдущего издания книги, по сути знаменуют появление совершенно новых концепций, так что для их эффективного использования недостаточно просто узнать об их существовании, и программировать на современном Java с использованием старых парадигм.
К программированию в полной мере относится фраза Евклида о том, что в геометрии нет царских путей. Но пройти путь изучения и освоения языка программирования вам может помочь проводник, показывающий наиболее интересные места и предупреждающий о ямах и ухабах. Таким проводником может послужить книга Джошуа Блоха. С ней вы не заблудитесь и не забредете в дебри, из которых будете долго и трудно выбираться с помощью отладчика.
При этом книга не просто научит вас использовать новые возможности языка — она научит использовать их эффективно. Но и это не все — книга не просто учит эффективному применению Java, но еще и рассказывает, почему ту или иную задачу следует решать именно так.
Эта книга заставляет вас не просто заучить правила — она заставляет думать.
И хотя эта книга в первую очередь предназначена для энтузиастов и профессионалов, она достойна места на полке любого программиста — как профессионала, так и зеленого новичка.
Язык программирования Java существенно изменился со времени предыдущего издания книги, опубликованного вскоре после выпуска Java 6. Этот классический труд тщательно обновлен, чтобы читатели могли в полной мере воспользоваться возможностями последних версий языка и его библиотек функций. В современном Java поддерживается несколько парадигм программирования. Поэтому программисты часто испытывают потребность в конкретных рекомендациях, которые и описаны в данной книге.
Как и в предыдущих изданиях, каждая глава книги состоит из ряда разделов, в каждом из которых описаны конкретные советы, приведены тонкости платформы Java и содержатся обновленные примеры кода. Для каждой темы приводится всеобъемлющее описание и пояснения, как следует поступить в данном случае, как не следует, и почему.
Третье издание охватывает особенности языка программирования и библиотек, появившихся в Java 7, 8 и 9, в том числе конструкции функционального программирования, добавленные к своим объектно-ориентированным корням. В книгу включены также многие новые советы, а также глава, посвященная лямбда-выражениям и потокам.
Основные темы книги:
• Функциональные интерфейсы, лямбда-выражения, ссылки на методы и потоки
• Методы по умолчанию и статические методы в интерфейсах
• Вывод типа, включая оператор ромб () для обобщенных типов
• Аннотация @SafeVarargs
• Конструкция try-с-ресурсами
• Новые возможности библиотек, такие как интерфейс Optional, java.time и удобные фабричные методы для коллекций
Author(s): Джошуа Блох
Edition: 3-е изд.
Publisher: ООО "Диалектика"
Year: 2019
Language: Russian
Pages: 464
Содержание
Вступительное слово
Предисловие
Предисловие к третьему изданию
Предисловие ко второму изданию
Предисловие к первому изданию
Благодарности
Благодарности к третьему изданию
Благодарности ко второму изданию
Благодарности к первому изданию
Ждем ваших отзывов!
Глава 1. Введение
Глава 2. Создание и уничтожение объектов
2.1. Рассмотрите применение статических фабричных методов вместо конструкторов
2.2. При большом количестве параметров конструктора подумайте о проектном шаблоне Строитель
2.3. Получайте синглтон с помощью закрытого конструктора или типа перечисления
2.4. Обеспечивайте неинстанцируемость с помощью закрытого конструктора
2.5. Предпочитайте внедрение зависимостей жестко прошитым ресурсам
2.6. Избегайте создания излишних объектов
2.7. Избегайте устаревших ссылок на объекты
2.8. Избегайте финализаторов и очистителей
2.9. Предпочитайте try-с-ресурсами использованию try-finally
Глава 3. Методы, общие для всех объектов
3.1. Перекрывая equals, соблюдайте общий контракт
3.2. Всегда при перекрытии equals перекрывайте hashCode
3.3. Всегда перекрывайте toString
3.4. Перекрывайте метод clone осторожно
3.5. Подумайте о реализации Comparable
Глава 4. Классы и интерфейсы
4.1. Минимизируйте доступность классов и членов
4.2. Используйте в открытых классах методы доступа, а не открытые поля
4.3. Минимизируйте изменяемость
4.4. Предпочитайте композицию наследованию
4.5. Проектируйте и документируйте наследование либо запрещайте его
4.6. Предпочитайте интерфейсы абстрактным классам
4.7. Проектируйте интерфейсы для потомков
4.8. Используйте интерфейсы только для определения типов
4.9. Предпочитайте иерархии классов дескрипторам классов
4.10. Предпочитайте статические классы-члены нестатическим
4.11. Ограничивайтесь одним классом верхнего уровня на исходный файл
Глава 5. Обобщенное программирование
5.1. Не используйте несформированные типы
5.2. Устраняйте предупреждения о непроверяемом коде
5.3. Предпочитайте списки массивам
5.4. Предпочитайте обобщенные типы
5.5. Предпочитайте обобщенные методы
5.6. Используйте ограниченные символы подстановки для повышения гибкости API
5.7. Аккуратно сочетайте обобщенные типы и переменное количество аргументов
5.8. Применяйте безопасные с точки зрения типов гетерогенные контейнеры
Глава 6. Перечисления и аннотации
6.1. Используйте перечисления вместо констант int
6.2. Используйте поля экземпляров вместо порядковых значений
6.3. Используйте EnumSet вместо битовых полей
6.4. Используйте ЕпшпМар вместо индексирования порядковыми номерами
6.5. Имитируйте расширяемые перечисления с помощью интерфейсов
6.6. Предпочитайте аннотации схемам именования
6.7. Последовательно используйте аннотацию Override
6.8. Используйте интерфейсы-маркеры для определения типов
Глава 7. Лямбда-выражения и потоки
7.1. Предпочитайте лямбда-выражения анонимным классам
7.2. Предпочитайте ссылки на методы лямбда-выражениям
7.3. Предпочитайте использовать стандартные функциональные интерфейсы
7.4. Разумно используйте потоки
7.5. Предпочитайте в потоках функции без побочных эффектов
7.6. Предпочитайте коллекции потокам в качестве возвращаемых типов
7.7. Будьте внимательны при параллелизации потоков
Глава 8. Методы
8.1. Проверяйте корректность параметров
8.2. При необходимости создавайте защитные копии
8.3. Тщательно проектируйте сигнатуры методов
8.4. Перегружайте методы разумно
8.5. Используйте методы с переменным количеством аргументов с осторожностью
8.6. Возвращайте пустые массивы и коллекции, а не null
8.7. Возвращайте Optional с осторожностью
8.8. Пишите документирующие комментарии для всех открытых элементов API
Глава 9. Общие вопросы программирования
9.1. Минимизируйте область видимости локальных переменных
9.2. Предпочитайте циклы for для коллекции традиционным циклам for
9.3. Изучите и используйте возможности библиотек
9.4. Если вам нужны точные ответы, избегайте float и double
9.5. Предпочитайте примитивные типы упакованным примитивным типам
9.6. Избегайте применения строк там, где уместнее другой тип
9.7. Помните о проблемах производительности при конкатенации строк
9.8. Для ссылки на объекты используйте их интерфейсы
9.9. Предпочитайте интерфейсы рефлексии
9.10. Пользуйтесь машинно-зависимыми методами осторожно
9.11. Оптимизируйте осторожно
9.12. Придерживайтесь общепринятых соглашений по именованию
Глава 10. Исключения
10.1. Используйте исключения только в исключительных ситуациях
10.2. Используйте для восстановления проверяемые исключения, а для программных ошибок — исключения времени выполнения
10.3. Избегайте ненужных проверяемых исключений
10.4. Предпочитайте использовать стандартные исключения
10.5. Генерируйте исключения, соответствующие абстракции
10.6. Документируйте все исключения, которые может генерировать метод
10.7. Включайте в сообщения информацию о сбое
10.8. Добивайтесь атомарности сбоев
10.9. Не игнорируйте исключения
Глава 11. Параллельные вычисления
11.1. Синхронизируйте доступ к совместно используемым изменяемым данным
11.2. Избегайте излишней синхронизации
11.3. Предпочитайте исполнителей, задания и потоки данных потокам исполнения
11.4. Предпочитайте утилиты параллельности методам wait и notify
11.5. Документируйте безопасность с точки зрения потоков
11.6. Аккуратно применяйте отложенную инициализацию
11.7. Избегайте зависимости от планировщика потоков
Глава 12. Сериализация
12.1. Предпочитайте альтернативы сериализации Java
12.2. Реализуйте интерфейс Serializable крайне осторожно
12.3. Подумайте о применении пользовательской сериализованной формы
12.4. Создавайте защищенные методы readObject
12.5. Для управления экземпляром предпочитайте типы перечислений методу readResolve
12.6. Подумайте о применении прокси-агента сериализации вместо сериализованных экземпляров
Приложение. Соответствие статей второго издания разделам третьего издания
Список литературы
Предметный указатель