Опубликовано

Переходите с Java на Kotlin!

От Java к Kotlin

Расстояние от острова Ява до острова Котлин составляет 9892 километра по прямой. Чтобы преодолеть его, не пользуясь воздушным транспортом, понадобится как минимум неделя. Если вы — опытный Java-разработчик, который решил перейти на Kotlin, вам потребуется примерно столько же времени. Вы обнаружите, что в Kotlin все делается по-другому, он требует иных подходов к программированию. Этот язык более функционален, у него больше возможностей, поэтому перенос кода ваших проектов с Java на Kotlin — отличная идея.

Ваши гиды Дункан и Нэт уже проделали этот путь в 2015 году, и с тех пор помогли многим командам и отдельным разработчикам повторить его. Путешествуйте вместе с ними по проверенному маршруту, включающему такие промежуточные остановки, как переход от объектов JavaBeans к значениям, от коллекций Java к коллекциям Kotlin и от классов Java к классам Kotlin.

Авторы подробно объясняют ключевые концепции, а затем показывают, как постепенно и безопасно перенести код Java в идиоматичный Kotlin, сохраняя при этом совместимость. В результате код становится проще, выразительнее и удобнее для редактирования. К концу путешествия вы будете уверены в том, что сможете перевести все свои Java-проекты на платформу Kotlin, освоите Kotlin с нуля и научитесь управлять смешанной языковой базой кода по мере ее развития.

Книга описывает практические приемы рефакторинга и переноса кода написанных на Java мобильных приложений для Android  на язык Kotlin с сохранением совместимости. Приведено подробное сравнение этих двух языков, даны примеры перевода проектов с Java на Kotlin, добавления поддержки Kotlin в сборку Java. Показан переход от классов Java к классам Kotlin, от коллекций Java к коллекциям Kotlin, от объектов JavaBeans к значениям, от статических методов к функциям верхнего уровня. Подробно рассматривается обработка ошибок, приведены практические приемы управления проектами со смешанной кодовой базой. Даны советы по рефакторингу кода и функциональному программированию на Kotlin.

Взять знакомый всем старый добрый код Java и наблюдать за тем, как он постепенно превращается в лаконичный, четкий, выразительный и легкий в обслуживании код на языке Kotlin — замечательный способ выучить язык. Воспользуйтесь опытом, которым делятся Макгрегор и Прайс.
Венкат Субраманиам, Ph.D., писатель и основатель компании Agile Developer, Inc.

Самый быстрый способ перенести свои навыки и умения из Java в Kotlin. Обязательно к прочтению любому профессиональному разработчику на Java.
Дон и Дэвид Гриффитс, авторы книг «React. Сборник рецептов» и «Head First. Kotlin»

Книгу “От Java к Kotlin” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Предисловие…………………………………………………………………………………………… 11

Как устроена эта книга?……………………………………………………………………………………………………………. 12

Как были выбраны темы?…………………………………………………………………………………………………………. 12

Уровень сложности……………………………………………………………………………………………………………………. 13

Идеальный код…………………………………………………………………………………………………………………………… 14

Форматирование кода……………………………………………………………………………………………………………….. 14

Условные обозначения……………………………………………………………………………………………………………… 15

Использование примеров кода…………………………………………………………………………………………………. 16

Платформа онлайн-обучения O’Reilly……………………………………………………………………………………… 17

Как с нами связаться?………………………………………………………………………………………………………………… 17

Благодарности…………………………………………………………………………………………………………………………… 18

Благодарности Дункана………………………………………………………………………………………………… 18

Благодарности Нэта………………………………………………………………………………………………………. 19

Глава 1. Введение…………………………………………………………………………………… 21

Сущность языка программирования………………………………………………………………………………………… 21

История стилей программирования на Java (на наш взгляд)………………………………………………… 24

Первобытный стиль………………………………………………………………………………………………………… 24

Стиль JavaBeans…………………………………………………………………………………………………………….. 25

Корпоративный стиль……………………………………………………………………………………………………. 26

Инверсия абстракции………………………………………………………………………………………………. 27

Современный стиль………………………………………………………………………………………………………… 29

Будущее…………………………………………………………………………………………………………………………… 29

Сущность Kotlin…………………………………………………………………………………………………………………………. 29

Рефракторинг на Kotlin……………………………………………………………………………………………………………… 31

Принципы рефакторинга……………………………………………………………………………………………….. 32

Подразумеваем хорошее покрытие тестами………………………………………………………………… 33

Фиксации изменений рассчитаны на Git Bisect……………………………………………………………. 33

Над чем мы работаем?………………………………………………………………………………………………………………. 34

Приступим!…………………………………………………………………………………………………………………………………. 34

Глава 2. Перевод проектов с Java на Kotlin……………………………………………. 35

Стратегия……………………………………………………………………………………………………………………………………. 35

Добавление поддержки Kotlin в сборку Java…………………………………………………………………………… 37

Другие системы сборки……………………………………………………………………………………………. 40

Двигаемся дальше……………………………………………………………………………………………………………………… 40

Глава 3. От классов Java к классам Kotlin……………………………………………… 41

Исходный код…………………………………………………………………………………………………………… 41

Простой тип значений……………………………………………………………………………………………………………….. 41

Ограничения классов данных…………………………………………………………………………………………………… 48

Двигаемся дальше……………………………………………………………………………………………………………………… 52

Глава 4. От необязательных типов к обнуляемым…………………………………. 54

Как представить отсутствие чего-либо?………………………………………………………………………………….. 54

Рефракторинг от необязательных типов к обнуляемым…………………………………………………………. 56

Итерация и цикл for……………………………………………………………………………………………………. 58

Рефракторинг с помощью Expand-and-Contract……………………………………………………… 64

Рефракторинг в код, характерный для Kotlin………………………………………………………………………….. 64

Двигаемся дальше……………………………………………………………………………………………………………………… 71

Глава 5. От объектов JavaBeans к значениям…………………………………………. 72

JavaBeans……………………………………………………………………………………………………………………………………. 72

Значения……………………………………………………………………………………………………………………………………… 73

Почему следует выбирать значения?………………………………………………………………………………………. 74

Рефакторинг экземпляров JavaBeans в значения……………………………………………………………………. 74

Равенство объектов…………………………………………………………………………………………………. 81

Двигаемся дальше……………………………………………………………………………………………………………………… 82

Глава 6. От коллекций Java к коллекциям Kotlin………………………………….. 83

Коллекции Java………………………………………………………………………………………………………………………….. 83

Не изменяйте разделяемые коллекции……………………………………………………………………. 86

Коллекции Kotlin………………………………………………………………………………………………………………………… 86

Рефакторинг от коллекций Java к коллекциям Kotlin……………………………………………………………… 89

Подправим код на Java………………………………………………………………………………………………….. 90

Преобразование в Kotlin………………………………………………………………………………………………… 95

Двигаемся дальше……………………………………………………………………………………………………………………… 99

Глава 7. От действий к вычислениям…………………………………………………… 100

Функции……………………………………………………………………………………………………………………………………. 100

Вычисления………………………………………………………………………………………………………………………………. 101

Вычисляемое свойство или функция?………………………………………………………………….. 102

Действия……………………………………………………………………………………………………………………………………. 102

Почему это должно нас волновать?………………………………………………………………………………………. 103

Процедурное программирование…………………………………………………………………………. 104

Почему предпочтение отдается вычислениям?…………………………………………………………………….. 104

Рефракторинг действий в вычисления……………………………………………………………………………………. 105

Существующий код………………………………………………………………………………………………………. 105

2015 был концом времени……………………………………………………………………………………… 109

Улучшенный проект…………………………………………………………………………………………………….. 109

Конец игры……………………………………………………………………………………………………………………. 115

Двигаемся дальше……………………………………………………………………………………………………………………. 118

Глава 8. От статических методов к функциям верхнего уровня……………. 119

Модификатор Static в Java……………………………………………………………………………………………………… 119

Статическое состояние………………………………………………………………………………………….. 119

Функции верхнего уровня в Kotlin, объекты и объекты-компаньоны………………………………….. 120

Рефракторинг от статических методов к функциям верхнего уровня…………………………………. 122

Удобные функции………………………………………………………………………………………………….. 123

Перемещение на верхний уровень………………………………………………………………………………………….. 126

Kotlin’изация……………………………………………………………………………………………………………………………… 127

Перемещение функций верхнего уровня………………………………………………………………. 129

Двигаемся дальше……………………………………………………………………………………………………………………. 129

Глава 9. От многострочных функций к однострочным………………………… 130

Попытка № 1: Замена встроенным выражением…………………………………………………………………… 132

Попытка № 2: Ввести функцию………………………………………………………………………………………………. 133

Попытка № 3: Блок Let…………………………………………………………………………………………………………….. 138

Попытка № 4: Отступление…………………………………………………………………………………………………….. 140

Что должен возвращать метод Parse?……………………………………………………………………….. 143

Двигаемся дальше……………………………………………………………………………………………………………………. 143

Глава 10. От функций к функциям-расширениям………………………………… 145

Функции и методы……………………………………………………………………………………………………………………. 145

Функции-расширения………………………………………………………………………………………………………………. 147

Расширения и типы функций…………………………………………………………………………………………………… 148

Свойства-расширения……………………………………………………………………………………………………………… 149

Преобразования……………………………………………………………………………………………………………………….. 149

Как именовать преобразования?…………………………………………………………………………… 150

Обнуляемые параметры………………………………………………………………………………………………………….. 151

Обнуляемые получатели…………………………………………………………………………………………………………. 152

Обобщенные расширения……………………………………………………………………………………………………….. 154

Функции-расширения в качестве методов…………………………………………………………………………….. 155

Рефракторинг к функциям-расширениям……………………………………………………………………………….. 155

Двигаемся дальше……………………………………………………………………………………………………………………. 171

Глава 11. От методов к свойствам………………………………………………………… 172

Поля, акцессоры и свойства……………………………………………………………………………………………………. 172

Как выбрать?……………………………………………………………………………………………………………………………. 176

Мутирующие свойства……………………………………………………………………………………………………………. 178

Рефракторинг к свойствам………………………………………………………………………………………………………. 178

Двигаемся дальше……………………………………………………………………………………………………………………. 184

Глава 12. От функций к операторам…………………………………………………….. 185

Базовый класс: Money……………………………………………………………………………………………………………… 185

Добавление определяемого пользователем оператора……………………………………………………….. 187

Вызов нашего оператора из существующего кода Kotlin……………………………………………………. 189

Операторы для существующих классов Java……………………………………………………………………….. 191

Соглашения для аннотаций значений……………………………………………………………………………………. 191

Двигаемся дальше……………………………………………………………………………………………………………………. 195

Глава 13. От потоков к итерируемым объектам и последовательностям. 196

Потоки в Java……………………………………………………………………………………………………………………………. 196

Итераторы в Kotlin…………………………………………………………………………………………………………………… 198

Последовательности в Kotlin………………………………………………………………………………………………….. 199

Замена итераций и последовательностей……………………………………………………………. 199

Множественные итерации………………………………………………………………………………………………………. 200

Выбор между потоками, итераторами и последовательностями……………………………………….. 203

Алгебраическая трансформация……………………………………………………………………………………………. 204

Рефракторинг от потоков к итераторам и последовательностям……………………………………….. 207

Сначала итераторы……………………………………………………………………………………………………… 210

Последовательности…………………………………………………………………………………………………….. 214

Извлечение части конвейера……………………………………………………………………………………….. 218

Итоговая уборка…………………………………………………………………………………………………………… 220

Двигаемся дальше……………………………………………………………………………………………………………………. 221

Глава 14. От накопления объектов к преобразованиям……………………….. 222

Вычисление с использованием параметров накопления……………………………………………………… 222

Рефакторинг функций над немутирующими данными…………………………………………………………. 227

Давайте проделаем это снова………………………………………………………………………………………………… 233

Обогащение обнаруженной нами абстракции……………………………………………………………………… 237

По поводу имен……………………………………………………………………………………………………… 238

Двигаемся дальше……………………………………………………………………………………………………………………. 239

Глава 15. От инкапсулированных коллекций к псевдонимам типов……. 241

Защитные копии…………………………………………………………………………………………………….. 242

Создание коллекций доменов…………………………………………………………………………………………………. 243

Коллекции с другими свойствами………………………………………………………………………………………….. 244

Рефракторинг инкапсулированных коллекций…………………………………………………………………….. 245

Преобразование операций в расширения………………………………………………………………….. 246

Замена псевдонима типа……………………………………………………………………………………………… 248

Рефракторинг коллекций с другими свойствами……………………………………………………….. 254

Двигаемся дальше……………………………………………………………………………………………………………………. 257

Глава 16. От интерфейсов к функциям…………………………………………………. 259

Объектно-ориентированная инкапсуляция…………………………………………………………………………… 260

Функциональная инкапсуляция……………………………………………………………………………………………… 263

Функциональные типы в Java…………………………………………………………………………………………………. 266

Сочетание и совмещение………………………………………………………………………………………………………… 269

Выразительные типы функций………………………………………………………………………………. 271

Сравнение подходов……………………………………………………………………………………………………………….. 272

Соединение………………………………………………………………………………………………………………………………. 275

Объектно-ориентированный или функциональный?……………………………………………………………. 276

Наследие Java………………………………………………………………………………………………………………………….. 279

Прослеживаемость…………………………………………………………………………………………………………………… 280

Рефракторинг от интерфейсов к функциям……………………………………………………………………………. 280

Введение функций………………………………………………………………………………………………………… 284

Двигаемся дальше……………………………………………………………………………………………………………………. 288

Глава 17. От мокинга к маппингу………………………………………………………… 289

Повреждение теста, вызванное моком…………………………………………………………………… 290

Замена мокинга маппингом…………………………………………………………………………………………………….. 292

Но действительно ли мы хотим уйти от моков?……………………………………………………………………. 297

Двигаемся дальше……………………………………………………………………………………………………………………. 301

Глава 18. От открытых классов к запечатанным…………………………………. 302

Полиморфизм или запечатанные классы?…………………………………………………………………………….. 306

Преобразование интерфейса в запечатанный класс……………………………………………………………. 307

Двигаемся дальше……………………………………………………………………………………………………………………. 315

Глава 19. От проверяемых исключений к типам результатов………………. 316

Перезагрузка интернет-соединения………………………………………………………………………. 316

Обработка ошибок до появления методов, основанных на исключениях…………………………. 318

Обработка ошибок с исключениями………………………………………………………………………………………. 319

Java и проверяемые исключения……………………………………………………………………………………………. 320

Как должен быть оформлен сбой parseInt?………………………………………………………………… 321

Kotlin и исключения…………………………………………………………………………………………………………………. 322

За пределами исключений: функциональная обработка ошибок………………………………………. 322

Обработка ошибок в Kotlin……………………………………………………………………………………………………… 326

Рефракторинг от исключений к обработке ошибок……………………………………………………………… 327

HTTP……………………………………………………………………………………………………………………….. 328

Наша стратегия преобразования………………………………………………………………………………… 329

Начнем с самого низа…………………………………………………………………………………………………… 330

Именование……………………………………………………………………………………………………………. 331

Контракт……………………………………………………………………………………………………………………….. 335

Отступление………………………………………………………………………………………………………………….. 339

Еще исправления……………………………………………………………………………………………………………………… 343

Слои………………………………………………………………………………………………………………………………………….. 349

Двигаемся дальше……………………………………………………………………………………………………………………. 351

Глава 20. От выполнения ввода/вывода к передаче данных………………… 353

Прослушивание тестов……………………………………………………………………………………………………………. 353

Ввод/вывод данных…………………………………………………………………………………………………………………. 356

Рефакторинг для удобства чтения…………………………………………………………………………. 361

Эффективное написание………………………………………………………………………………………………………….. 361

Еще о стимулах к работе……………………………………………………………………………………….. 361

Эффективное считывание……………………………………………………………………………………………………….. 365

Двигаемся дальше……………………………………………………………………………………………………………………. 370

Глава 21. От исключений к значениям…………………………………………………. 371

Определение того, что может пойти не так…………………………………………………………………………… 371

Представление ошибок……………………………………………………………………………………………………………. 379

А как насчет ввода/вывода?……………………………………………………………………………………………………. 387

Двигаемся дальше……………………………………………………………………………………………………………………. 388

Глава 22. От классов к функциям………………………………………………………… 389

Приемочный тест……………………………………………………………………………………………………………………… 389

Модульное тестирование……………………………………………………………………………………………………….. 394

Заголовки………………………………………………………………………………………………………………………………….. 399

Различные разделители полей……………………………………………………………………………………………….. 408

Последовательности……………………………………………………………………………………………………………….. 415

Считывание из файла………………………………………………………………………………………………………………. 421

Сравнение с Commons CSV……………………………………………………………………………………………………. 426

Двигаемся дальше……………………………………………………………………………………………………………………. 432

Глава 23. Продолжение путешествия……………………………………………………. 433

О сущностях……………………………………………………………………………………………………………………………… 433

Функциональное мышление……………………………………………………………………………………………………. 434

Простая конструкция………………………………………………………………………………………………………………. 436

Функциональное программирование и текстуальные рассуждения………………………………….. 437

Рефакторинг……………………………………………………………………………………………………………………………… 438

Рефакторинг и функциональное мышление…………………………………………………………………………… 439

Предметный указатель…………………………………………………………………………. 441

Об авторах……………………………………………………………………………………………. 443

Об изображении на обложке………………………………………………………………… 444

Дункан Макгрегор
Нэт Прайс

Дункан Макгрегор (Duncan McGregor) и Нэт Прайс (Nat Pryce) — опытные разработчики, консультанты и преподаватели. Ранние последователи как Java, так и Kotlin, они научились сочетать методы объектно-ориентированного и функционального программирования, а  также рефакторинга между этими языками. Их успешные семинары на KotlinConf доказали ценность обучения через рефакторинг и привели к написанию этой книги.

Опубликовано

Научитесь создавать приложения для Android с нуля!

Разработка Android-приложений с нуля

Вышла книга “Разработка Android-приложений с нуля. 3 изд.”, которая научит вас разрабатывать профессиональные, полнофункциональные приложения для Android, даже если раньше вы никогда не программировали!

Доступно изложены основы программирования на Java для Android, включая объектно-ориентированное программирование. Описаны установка и настройка среды разработки Android Studio, создание функциональных пользовательских интерфейсов с помощью визуального редактора Android Studio. Раскрыты принципы материального дизайна. Рассмотрены компоновки CardView и ScrollView, обработка касаний экрана, захват данных, использование в приложении звука и анимации, поддержка различных версий Android и нескольких языков интерфейса. Затронута тема хранения данных во встроенной базе данных SQLite. Показаны паттерны проектирования, используемые профессионалами для создания современных мобильных приложений.

Вы хотите сделать карьеру в программировании, но не знаете с чего начать? У вас есть отличная идея для мобильного приложения, и вы мечтаете воплотить ее в жизнь? Эта книга поможет реализовать ваши идеи и станет незаменимым руководством по созданию приложений для Android с нуля!

Вы познакомитесь со всеми фундаментальными понятиями программирования для Android, начиная с основ Java и заканчивая работой с Android API.

Вы изучите основы создания мобильных приложений в Android Studio и принципы объектно-ориентированного программирования.

Вы освоите разработку приложений с профессиональным современным интерфейсом и возможностью хранения пользовательских данных в базе SQLite.

Вы узнаете, как сделать приложение многоязычным, как рисовать на экране, работать с графикой, звуком и анимацией.

Вы будете готовы создавать собственные профессиональные приложения для Android на Java.

  • Фундаментальные основы программирования для Android
  • Использование всех возможностей Android Studio
  • Разработка современных интерфейсов для мобильных приложений и материальный дизайн
  • Синтаксис и возможности языка Java
  • Объектно-ориентированное программирование
  • Сохранение и совместное использование данных
  • Анимация, рисование и графика, звуковые эффекты
  • Поддержка различных версий Android и нескольких языков интерфейса
  • Использование баз данных

Книгу “Разработка Android-приложений с нуля. 3 изд.” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Предисловие……………………………………………………………………………………………………………………………… 17

Для кого эта книга……………………………………………………………………………………………………………………… 17

О чем эта книга…………………………………………………………………………………………………………………………… 18

Как получить максимум пользы от этой книги……………………………………………………………………….. 21

Файлы с примерами кода………………………………………………………………………………………………………….. 22

Цветные изображения……………………………………………………………………………………………………………….. 22

Условные обозначения……………………………………………………………………………………………………………… 22

Контакты…………………………………………………………………………………………………………………………………….. 23

Отзывы………………………………………………………………………………………………………………………………………… 23

Глава 1. Начало работы с Android и Java…………………………………………………………………………….. 24

Технические требования…………………………………………………………………………………………………………… 25

Новое в третьем издании…………………………………………………………………………………………………………… 25

Почему Java и Android?…………………………………………………………………………………………………………….. 26

Первый камень преткновения для новичков……………………………………………………………………………. 27

Как Java и Android работают вместе……………………………………………………………………………………….. 27

Что такое Android API………………………………………………………………………………………………………… 28

Java — объектно-ориентированный язык программирования………………………………………. 29

Повторим: что такое Android…………………………………………………………………………………………….. 31

Android Studio……………………………………………………………………………………………………………………… 31

Настройка Android Studio…………………………………………………………………………………………………………. 32

Что делает приложение для Android?………………………………………………………………………………………. 35

Ресурсы Android…………………………………………………………………………………………………………………. 35

Структура кода Java в Android…………………………………………………………………………………………………. 36

Пакеты…………………………………………………………………………………………………………………………………. 36

Классы………………………………………………………………………………………………………………………………… 37

Методы……………………………………………………………………………………………………………………………….. 37

Создание нашего первого приложения для Android……………………………………………………………….. 38

Развертывание приложения на данном этапе…………………………………………………………………………. 42

Запуск и отладка приложения на эмуляторе Android…………………………………………………….. 43

Запуск приложения на реальном устройстве………………………………………………………………….. 45

Часто задаваемые вопросы………………………………………………………………………………………………………. 47

Итоги…………………………………………………………………………………………………………………………………………… 47

Глава 2. Первое знакомство: Java, XML и визуальный редактор…………………………………… 48

Технические требования…………………………………………………………………………………………………………… 48

Изучение вывода Logcat……………………………………………………………………………………………………………. 48

Фильтрация вывода Logcat……………………………………………………………………………………………….. 49

Java-проект и XML-код основной компоновки……………………………………………………………………….. 50

Файл MainActivity.java……………………………………………………………………………………………………… 50

Сворачивание (скрытие) кода в Android Studio……………………………………………………… 50

Объявление пакета……………………………………………………………………………………………………. 51

Импорт классов…………………………………………………………………………………………………………. 52

Класс………………………………………………………………………………………………………………………….. 52

Методы внутри класса……………………………………………………………………………………………… 53

Итог по коду Java на данный момент……………………………………………………………………… 53

Файл компоновки приложения………………………………………………………………………………………….. 53

Элементы компоновки пользовательского интерфейса………………………………………… 56

Текстовые элементы пользовательского интерфейса……………………………………………. 56

Элементы-кнопки пользовательского интерфейса………………………………………………… 57

Добавление кнопок в основной файл компоновки………………………………………………………………….. 57

Добавление кнопки с использованием визуального редактора…………………………………….. 58

Редактирование атрибутов кнопки…………………………………………………………………………. 60

XML-код новой кнопки…………………………………………………………………………………………….. 62

Добавление кнопки путем редактирования XML-кода………………………………………………….. 63

Назначение кнопкам уникальных атрибутов id……………………………………………………………… 65

Размещение двух кнопок в компоновке……………………………………………………………………………. 65

Как заставить кнопки вызывать разные методы……………………………………………………………… 68

Комментирование Java-кода…………………………………………………………………………………………………….. 69

Отправка сообщений пользователю и разработчику…………………………………………………………….. 69

Написание первого Java-кода………………………………………………………………………………………………….. 70

Добавление кода с сообщением в метод onCreate………………………………………………………….. 70

Изучение вывода……………………………………………………………………………………………………….. 71

Написание собственных методов Java…………………………………………………………………………….. 72

Изучение вывода……………………………………………………………………………………………………….. 74

Часто задаваемые вопросы………………………………………………………………………………………………………. 75

Итоги…………………………………………………………………………………………………………………………………………… 75

Глава 3. Android Studio и структура проекта………………………………………………………………………. 77

Технические требования…………………………………………………………………………………………………………… 78

Проводник проекта и анатомия проекта…………………………………………………………………………………. 78

Структура файлов и папок в шаблоне проекта Empty Activity…………………………………………….. 78

Проект Empty Activity………………………………………………………………………………………………………… 80

Папка manifests………………………………………………………………………………………………………….. 81

Папка java………………………………………………………………………………………………………………….. 83

Папка Java (generated)……………………………………………………………………………………………… 86

Папка res……………………………………………………………………………………………………………………. 86

Папка res/drawable……………………………………………………………………………………………………. 86

Папка res/layout………………………………………………………………………………………………………… 87

Папка res/mipmap………………………………………………………………………………………………………. 87

Папка res/values………………………………………………………………………………………………………… 89

Файл colors.xml………………………………………………………………………………………………………….. 89

Файл strings.xml…………………………………………………………………………………………………………. 90

Cтруктура файлов и папок в шаблоне проекта Basic Activity……………………………………………….. 92

Проект Basic Activity………………………………………………………………………………………………………………….. 93

Файл MainActivity.java……………………………………………………………………………………………… 93

Файл activity_main.xml……………………………………………………………………………………………… 96

Дополнительные методы в MainActivity.java…………………………………………………………. 97

Эмулятор Android………………………………………………………………………………………………………………………. 98

Панель управления эмулятором……………………………………………………………………………………….. 99

Использование эмулятора как реального устройства………………………………………………….. 100

Доступ к панели приложений………………………………………………………………………………… 100

Просмотр активных приложений и переключение между приложениями………… 101

Итоги…………………………………………………………………………………………………………………………………………. 102

Глава 4. Начало работы с компоновками и материальный дизайн…………………………….. 103

Технические требования…………………………………………………………………………………………………………. 104

Материальный дизайн…………………………………………………………………………………………………………….. 104

Дизайн пользовательского интерфейса Android…………………………………………………………………… 104

Компоновки………………………………………………………………………………………………………………………………. 105

Создание и изучение проекта компоновок…………………………………………………………………….. 105

Создание компоновки с помощью LinearLayout…………………………………………………………… 106

Добавление типа компоновки LinearLayout в проект…………………………………………………… 107

Подготовка рабочего пространства………………………………………………………………………………. 108

Изучение сгенерированного XML-кода…………………………………………………………………………. 108

Добавление TextView в пользовательский интерфейс………………………………………………….. 110

Добавление многострочного TextView в пользовательский интерфейс……………………… 112

Подключение пользовательского интерфейса с помощью кода Java. Часть 1…………… 113

Добавление компоновок в компоновки………………………………………………………………………….. 116

Украшение компоновки…………………………………………………………………………………………………… 119

Подключение пользовательского интерфейса с помощью кода Java. Часть 2…………… 121

Создание точного пользовательского интерфейса с помощью ConstraintLayout……………… 121

Добавление CalendarView……………………………………………………………………………………………….. 121

Изменение размера представления в ConstraintLayout……………………………………….. 122

Использование окна Component Tree……………………………………………………………………. 122

Добавление ограничений вручную……………………………………………………………………….. 124

Добавление и ограничение дополнительных элементов пользовательского интерфейса 126

Создание интерактивного текста……………………………………………………………………………………. 128

Размещение данных с помощью TableLayout……………………………………………………………………….. 129

Добавление элемента TableRow…………………………………………………………………………………….. 130

Использование Component Tree для решения задач, невыполнимых
в визуальном редакторе…………………………………………………………………………………………. 130

Организация столбцов таблицы……………………………………………………………………………………… 132

Добавление ссылки на главное меню…………………………………………………………………………………….. 134

Итоги…………………………………………………………………………………………………………………………………………. 135

Глава 5. Красивые компоновки на основе CardView и ScrollView………………………………… 136

Технические требования…………………………………………………………………………………………………………. 136

Атрибуты пользовательского интерфейса…………………………………………………………………………….. 136

Размеры и использование dp…………………………………………………………………………………………… 136

Размеры шрифтов и использование sp……………………………………………………………………………. 137

Определение размера с wrap и match…………………………………………………………………………….. 139

Использование padding и margin……………………………………………………………………………………. 140

Использование свойства layout_weight…………………………………………………………………………. 141

Использование gravity……………………………………………………………………………………………………… 142

Создание пользовательского интерфейса с помощью CardView и ScrollView…………………… 144

Настройка представления с помощью кода Java…………………………………………………………. 144

Добавление изображений……………………………………………………………………………………………….. 145

Создание контента для карточек……………………………………………………………………………………. 146

Определение размеров для CardView…………………………………………………………………………….. 149

Добавление CardView в компоновку………………………………………………………………………………. 149

Добавление файлов компоновки внутрь другой компоновки……………………………… 151

Создание эмулятора планшета………………………………………………………………………………………………. 154

Часто задаваемые вопросы…………………………………………………………………………………………………….. 156

Итоги…………………………………………………………………………………………………………………………………………. 156

Глава 6. Жизненный цикл Android…………………………………………………………………………………….. 157

Технические требования…………………………………………………………………………………………………………. 157

Жизнь приложения для Android……………………………………………………………………………………………… 158

Взаимодействие Android с приложениями…………………………………………………………………………….. 158

Упрощенное объяснение жизненного цикла Android……………………………………………………………. 159

Демистификация фаз жизненного цикла………………………………………………………………………… 160

Работа с фазами жизненного цикла……………………………………………………………………………………….. 161

Демонстрационное приложение жизненного цикла…………………………………………………………….. 163

Написание кода для демонстрационного приложения жизненного цикла………………… 164

Запуск демонстрационного приложения жизненного цикла……………………………………….. 166

Вывод демонстрационного приложения жизненного цикла………………………………………… 167

Некоторые другие переопределенные методы……………………………………………………………… 168

Еще раз о структуре кода Java……………………………………………………………………………………………….. 170

Представление фрагментов и жизненного цикла………………………………………………………………….. 171

Итоги…………………………………………………………………………………………………………………………………………. 172

Глава 7. Переменные, операторы и выражения Java………………………………………………………. 173

Технические требования…………………………………………………………………………………………………………. 173

Java повсюду……………………………………………………………………………………………………………………………. 174

Синтаксис и жаргон Java………………………………………………………………………………………………………… 174

Дополнительные комментарии к коду……………………………………………………………………………. 175

Хранение и использование данных с переменными…………………………………………………………….. 177

Типы переменных…………………………………………………………………………………………………………….. 178

Примитивные типы…………………………………………………………………………………………………. 178

Ссылочные типы…………………………………………………………………………………………………….. 181

Использование переменных……………………………………………………………………………………………………. 182

Объявление переменной………………………………………………………………………………………………………….. 182

Инициализация переменной……………………………………………………………………………………………………. 183

Изменение значений переменных с помощью операторов………………………………………………….. 184

Оператор присваивания………………………………………………………………………………………………….. 184

Оператор сложения………………………………………………………………………………………………………….. 184

Оператор вычитания……………………………………………………………………………………………………….. 185

Оператор деления…………………………………………………………………………………………………………….. 185

Оператор умножения……………………………………………………………………………………………………….. 185

Оператор инкремента………………………………………………………………………………………………………. 186

Оператор декремента………………………………………………………………………………………………………. 186

Выражения Java………………………………………………………………………………………………………………………. 186

Демоприложение Expressing Yourself…………………………………………………………………………….. 187

Итог…………………………………………………………………………………………………………………………………………… 189

Глава 8. Условия и циклы Java…………………………………………………………………………………………… 190

Технические требования…………………………………………………………………………………………………………. 190

Принятие решений в Java………………………………………………………………………………………………………… 191

Отступы в коде для ясности…………………………………………………………………………………………….. 191

Больше операторов………………………………………………………………………………………………………….. 192

Оператор сравнения……………………………………………………………………………………………….. 192

Логический оператор отрицания…………………………………………………………………………… 192

Оператор НЕравенства………………………………………………………………………………………….. 193

Оператор «больше»………………………………………………………………………………………………… 193

Оператор «меньше»………………………………………………………………………………………………… 193

Оператор «больше или равно»………………………………………………………………………………. 193

Оператор «меньше или равно»………………………………………………………………………………. 193

Логический оператор «И»………………………………………………………………………………………. 193

Логический оператор «ИЛИ»…………………………………………………………………………………. 194

Оператор модуля…………………………………………………………………………………………………….. 194

Использование операторов для проверки переменных………………………………………………… 194

Использование ключевого слова if языка Java…………………………………………………….. 194

Switch и принятие решений…………………………………………………………………………………………………….. 197

Демоприложение Switch………………………………………………………………………………………………….. 198

Повторение кода с циклами……………………………………………………………………………………………………. 200

Циклы while………………………………………………………………………………………………………………………. 200

Выход из цикла……………………………………………………………………………………………………….. 202

Ключевое слово continue……………………………………………………………………………………….. 203

Циклы do while…………………………………………………………………………………………………………………. 204

Циклы for………………………………………………………………………………………………………………………………….. 205

Демоприложение Loops для работы с циклами……………………………………………………………………. 206

Итоги…………………………………………………………………………………………………………………………………………. 209

Глава 9. Методы Java…………………………………………………………………………………………………………….. 210

Технические требования…………………………………………………………………………………………………………. 210

Еще раз о методах……………………………………………………………………………………………………………………. 210

Java-методы……………………………………………………………………………………………………………………… 211

Структура метода……………………………………………………………………………………………………………………. 211

Модификатор……………………………………………………………………………………………………………………. 212

Возвращаемый тип…………………………………………………………………………………………………………… 213

Имя метода……………………………………………………………………………………………………………………….. 214

Параметры………………………………………………………………………………………………………………………… 215

Тело метода………………………………………………………………………………………………………………………. 216

Демонстрационное приложение для изучения методов………………………………………………………. 216

Методы Real world…………………………………………………………………………………………………………… 217

Обнаружение области видимости переменной……………………………………………………. 218

Перегрузка метода…………………………………………………………………………………………………………………… 219

Еще раз об области видимости и переменных………………………………………………………………………. 221

Рекурсия метода………………………………………………………………………………………………………………………. 222

Вопросы……………………………………………………………………………………………………………………………………. 224

Итоги…………………………………………………………………………………………………………………………………………. 225

Самостоятельное чтение…………………………………………………………………………………………………………. 226

Глава 10. Объектно-ориентированное программирование…………………………………………… 227

Технические требования…………………………………………………………………………………………………………. 227

Важное предупреждение об управлении памятью………………………………………………………………. 227

Объектно-ориентированное программирование………………………………………………………………….. 228

Что такое ООП?………………………………………………………………………………………………………………… 228

Инкапсуляция………………………………………………………………………………………………………….. 228

Полиморфизм…………………………………………………………………………………………………………… 229

Наследование………………………………………………………………………………………………………….. 229

Почему надо делать именно так?…………………………………………………………………………………… 230

Резюме: класс……………………………………………………………………………………………………………………. 230

Код класса………………………………………………………………………………………………………………………………… 230

Реализация класса……………………………………………………………………………………………………………. 231

Объявление, инициализация и использование объекта класса……………………………………. 231

Приложение Basic Classes……………………………………………………………………………………………………….. 234

Что еще можно сделать с нашим первым классом………………………………………………………… 237

Часто задаваемые вопросы…………………………………………………………………………………………………….. 238

Итоги…………………………………………………………………………………………………………………………………………. 238

Глава 11. Больше объектно-ориентированного программирования…………………………… 239

Технические требования…………………………………………………………………………………………………………. 239

Вы еще помните об инкапсуляции?……………………………………………………………………………………….. 239

Управление доступом к классам с помощью модификаторов доступа………………………. 240

Модификаторы доступа к классам……………………………………………………………………….. 241

Резюме: доступ к классам………………………………………………………………………………………. 241

Управление доступом к переменным с помощью модификаторов доступа……………….. 241

Модификаторы доступа к переменным………………………………………………………………… 242

Резюме: доступ к переменным……………………………………………………………………………….. 243

Методы и модификаторы доступа…………………………………………………………………………………. 243

Модификаторы доступа к методам………………………………………………………………………. 243

Резюме: доступ к методу………………………………………………………………………………………… 244

Доступ к private-переменным с помощью геттеров и сеттеров………………………………… 244

Настройка объектов с помощью конструкторов…………………………………………………………… 247

Статические методы………………………………………………………………………………………………………………… 249

Мини-приложение инкапсуляции и статических методов…………………………………………………… 251

ООП и наследование……………………………………………………………………………………………………………….. 255

Приложение с наследованием………………………………………………………………………………………………… 257

Полиморфизм……………………………………………………………………………………………………………………………. 261

Абстрактные классы………………………………………………………………………………………………………… 262

Интерфейсы………………………………………………………………………………………………………………………. 263

Часто задаваемые вопросы…………………………………………………………………………………………………….. 265

Итоги…………………………………………………………………………………………………………………………………………. 265

Глава 12. Стек, куча и сборщик мусора…………………………………………………………………………….. 266

Технические требования…………………………………………………………………………………………………………. 266

Все элементы пользовательского интерфейса Android — тоже классы……………………………… 266

Ссылки: повторное знакомство………………………………………………………………………………………. 267

Небольшой перерыв, чтобы выбросить мусор…………………………………………………….. 267

Шесть фактов о стеке и куче………………………………………………………………………………….. 268

В чем польза этой кучи?………………………………………………………………………………………………….. 268

Использование кнопок и виджетов TextView из компоновки………………………………………… 269

Запуск приложения………………………………………………………………………………………………………….. 277

Внутренние и анонимные классы…………………………………………………………………………………………… 278

Часто задаваемые вопросы…………………………………………………………………………………………………….. 279

Итоги…………………………………………………………………………………………………………………………………………. 279

Глава 13. Анонимные классы. Оживление виджетов Android……………………………………….. 280

Технические требования…………………………………………………………………………………………………………. 281

Объявление и инициализация объектов…………………………………………………………………………………. 281

Создание виджетов пользовательского интерфейса из Java без XML……………………………….. 281

Изучение палитры. Часть 1…………………………………………………………………………………………………….. 282

Виджет EditText………………………………………………………………………………………………………………… 283

Виджет ImageView……………………………………………………………………………………………………………. 283

Радиокнопки и группы…………………………………………………………………………………………………….. 284

Анонимные классы………………………………………………………………………………………………………………….. 285

Изучение палитры и анонимные классы. Часть 2…………………………………………………………………. 288

Switch………………………………………………………………………………………………………………………………… 288

CheckBox…………………………………………………………………………………………………………………………… 289

TextClock…………………………………………………………………………………………………………………………… 290

Использование WebView………………………………………………………………………………………………….. 290

Приложение Widget Exploration……………………………………………………………………………………………… 291

Настройка проекта Widget Exploration и его пользовательского интерфейса……………. 291

Написание кода для приложения Widget Exploration…………………………………………………… 297

Получение ссылок на все части пользовательского интерфейса……………………….. 297

Написание кода с чекбоксами……………………………………………………………………………….. 299

Написание кода с радиокнопками………………………………………………………………………… 301

Использование анонимного класса для обычной кнопки Button……………………….. 302

Написание кода для виджета Switch…………………………………………………………………….. 303

Использование WebView…………………………………………………………………………………………………………. 304

Запуск приложения Widget Exploration………………………………………………………………………………….. 304

Итоги…………………………………………………………………………………………………………………………………………. 306

Глава 14. Диалоговые окна Android…………………………………………………………………………………… 307

Технические требования…………………………………………………………………………………………………………. 307

Диалоговые окна……………………………………………………………………………………………………………………… 307

Создание проекта Dialog Demo………………………………………………………………………………………. 308

Написание кода класса DialogFragment……………………………………………………………………….. 308

Использование цепочки для конфигурации DialogFragment……………………………… 310

Использование класса DialogFragment…………………………………………………………………………. 311

Приложение Note to Self………………………………………………………………………………………………………….. 313

Применение соглашений об именах и строковых ресурсах………………………………………… 314

Получение файлов кода для приложения Note to Self………………………………………………….. 314

Завершенное приложение……………………………………………………………………………………………….. 315

Создание проекта…………………………………………………………………………………………………………….. 318

Подготовка строковых ресурсов…………………………………………………………………………………….. 318

Написание кода класса Note…………………………………………………………………………………………… 319

Реализация компоновок для диалоговых окон……………………………………………………………… 321

Написание кода диалоговых окон…………………………………………………………………………………. 325

Написание кода класса DialogNewNote……………………………………………………………….. 325

Написание кода класса DialogShowNote……………………………………………………………… 329

Удаление ненужных автосгенерированных фрагментов……………………………………. 331

Демонстрация диалоговых окон…………………………………………………………………………………….. 332

Написание кода плавающей кнопки действия…………………………………………………….. 333

Итоги…………………………………………………………………………………………………………………………………………. 336

Глава 15. Массивы, словари Map и случайные числа……………………………………………………… 337

Технические требования…………………………………………………………………………………………………………. 337

«Случайное» отступление………………………………………………………………………………………………………. 338

Обработка больших объемов данных с помощью массивов……………………………………………….. 338

Массивы — это объекты…………………………………………………………………………………………………. 340

Пример мини-приложения с простым массивом…………………………………………………………………… 341

Реализация динамического массива………………………………………………………………………………………. 342

Мини-приложение с динамическим массивом………………………………………………………………. 343

Работа с многомерными массивами………………………………………………………………………………………. 344

Мини-приложение с многомерным массивом……………………………………………………………….. 344

Исключения Array-out-of-bounds…………………………………………………………………………………….. 347

Структура данных ArrayList…………………………………………………………………………………………………… 348

Расширенный цикл for……………………………………………………………………………………………………… 349

Полиморфизм массивов и экземпляров ArrayList………………………………………………………………….. 350

Больше коллекций Java: HashMap…………………………………………………………………………………………. 351

Приложение Note to Self………………………………………………………………………………………………………….. 352

Часто задаваемые вопросы…………………………………………………………………………………………………….. 353

Итоги…………………………………………………………………………………………………………………………………………. 353

Глава 16. Адаптеры и классы Recycler……………………………………………………………………………….. 354

Технические требования…………………………………………………………………………………………………………. 354

RecyclerView и RecyclerAdapter………………………………………………………………………………………………. 354

Проблема с отображением большого количества виджетов……………………………………….. 355

Решение проблемы отображения большого количества виджетов…………………………….. 355

Практическое применение RecyclerView и RecyclerAdapter…………………………………………. 356

Настройка RecyclerView с RecyclerAdapter и заметками ArrayList……………………………… 357

Добавление RecyclerView, RecyclerAdapter и ArrayList в проект Note to Self……………………… 358

Удаление временной кнопки Show Note и добавление RecyclerView………………………………….. 358

Создание элемента списка для RecyclerView………………………………………………………………… 359

Написание кода класса RecyclerAdapter……………………………………………………………………….. 360

Написание кода конструктора NoteAdapter………………………………………………………… 364

Написание кода метода onCreateViewHolder………………………………………………………. 364

Написание метода onBindViewHolder………………………………………………………………….. 365

Написание кода метода getItemCount…………………………………………………………………… 365

Написание кода внутреннего класса ListItemHolder…………………………………………… 366

Написание кода MainActivity для использования классов RecyclerView и RecyclerAdapter          367

Добавление кода в метод onCreate……………………………………………………………………….. 367

Изменение метода addNote…………………………………………………………………………………….. 368

Написание метода showNote…………………………………………………………………………………. 368

Запуск приложения………………………………………………………………………………………………………………….. 369

Часто задаваемые вопросы…………………………………………………………………………………………………….. 370

Итоги…………………………………………………………………………………………………………………………………………. 370

Глава 17. Сохранение и совместное использование данных…………………………………………. 371

Технические требования…………………………………………………………………………………………………………. 371

«Намерения» Android………………………………………………………………………………………………………………. 372

Переключение Activity……………………………………………………………………………………………………… 372

Передача данных между активностями…………………………………………………………………………. 373

Добавление страницы настроек в Note to Self………………………………………………………………………. 374

Создание SettingsActivity…………………………………………………………………………………………………. 374

Разработка компоновки экрана настроек……………………………………………………………………… 375

Предоставление пользователю возможности переключаться на экран настроек…….. 375

Сохранение данных с помощью SharedPreferences……………………………………………………………… 377

Загрузка данных с помощью SharedPreferences…………………………………………………………………… 378

Сохранение настроек приложения Note to Self…………………………………………………………………….. 379

Написание кода класса SettingsActivity…………………………………………………………………………. 379

Написание кода класса MainActivity……………………………………………………………………………… 381

Более продвинутый способ сохранения данных………………………………………………………………….. 383

Классы JSON…………………………………………………………………………………………………………………….. 383

Исключения Java: try, catch и finally………………………………………………………………………………. 384

Резервное копирование пользовательских данных в Note to Self……………………………………….. 385

Часто задаваемые вопросы…………………………………………………………………………………………………….. 391

Итоги…………………………………………………………………………………………………………………………………………. 391

Глава 18. Локализация…………………………………………………………………………………………………………. 392

Технические требования…………………………………………………………………………………………………………. 392

Реализация поддержки испанского и немецкого языков в приложении Note to Self………….. 392

Добавление поддержки испанского языка…………………………………………………………………….. 393

Добавление поддержки немецкого языка………………………………………………………………………. 393

Добавление строковых ресурсов……………………………………………………………………………………. 394

Запуск приложения Note to Self на немецком или испанском языке…………………………………… 396

Выполнение переводов в коде Java………………………………………………………………………………… 396

Итоги…………………………………………………………………………………………………………………………………………. 399

Глава 19. Анимация и интерполяторы………………………………………………………………………………. 400

Технические требования…………………………………………………………………………………………………………. 400

Анимации в Android…………………………………………………………………………………………………………………. 400

Создание интересной анимации в XML…………………………………………………………………………. 401

Исчезновение и появление……………………………………………………………………………………… 401

Движение…………………………………………………………………………………………………………………. 401

Масштабирование, или растяжение……………………………………………………………………… 401

Контроль продолжительности………………………………………………………………………………. 402

Вращение…………………………………………………………………………………………………………………. 402

Повторение анимации…………………………………………………………………………………………….. 402

Комбинирование эффектов анимации с помощью set…………………………………………. 402

Создание анимаций и управление ими с помощью кода Java…………………………………….. 403

Дополнительные функции анимации……………………………………………………………………………… 403

Слушатели анимации…………………………………………………………………………………………….. 403

Интерполяторы анимации……………………………………………………………………………………… 404

Демонстрационное приложение анимации. Знакомство с SeekBar…………………………………….. 405

Демонстрационная анимация…………………………………………………………………………………………. 405

Написание кода XML-анимации……………………………………………………………………………………. 408

Использование Java в демонстрационном приложении анимации…………………………….. 412

Часто задаваемые вопросы…………………………………………………………………………………………………….. 420

Итоги…………………………………………………………………………………………………………………………………………. 421

Глава 20. Рисование и графика…………………………………………………………………………………………… 422

Технические требования…………………………………………………………………………………………………………. 422

Понятие о классе Canvas…………………………………………………………………………………………………………. 422

Рисование с помощью Bitmap, Canvas и ImageView……………………………………………………… 423

Canvas и Bitmap………………………………………………………………………………………………………. 423

Paint…………………………………………………………………………………………………………………………. 423

ImageView и Activity………………………………………………………………………………………………… 424

Краткий обзор Canvas, Bitmap, Paint и ImageView………………………………………………. 424

Использование класса Canvas………………………………………………………………………………………………… 425

Подготовка экземпляров необходимых классов…………………………………………………………… 425

Инициализация объектов………………………………………………………………………………………………… 425

Настройка содержимого Activity……………………………………………………………………………………. 426

Демонстрационное приложение Canvas……………………………………………………………………………….. 426

Создание нового проекта………………………………………………………………………………………………… 426

Написание кода демонстрационного приложения Canvas………………………………… 427

Инициализация Bitmap…………………………………………………………………………………………… 428

Рисование на экране……………………………………………………………………………………………….. 428

Метод Color.argb……………………………………………………………………………………………………. 429

Система координат Android……………………………………………………………………………………………………. 431

Черчение и рисование……………………………………………………………………………………………………… 431

Создание растровых изображений………………………………………………………………………………………… 432

Управление растровыми изображениями……………………………………………………………………………… 433

Что такое растровое изображение…………………………………………………………………………………. 433

Класс Matrix……………………………………………………………………………………………………………………… 433

Поворот растрового изображения в противоположное направление……………….. 434

Поворот растрового изображения вверх или вниз………………………………………………. 435

Демонстрационное приложение для работы с растровыми изображениями…………………….. 436

Добавление графики в проект…………………………………………………………………………………………. 436

Часто задаваемые вопросы…………………………………………………………………………………………………….. 440

Итоги…………………………………………………………………………………………………………………………………………. 440

Глава 21. Потоки. Разработка приложения для интерактивного рисования……………… 441

Технические требования…………………………………………………………………………………………………………. 441

Создание проекта Live Drawing………………………………………………………………………………………………. 441

Рефакторинг MainActivity в LiveDrawingActivity…………………………………………………………… 442

Блокировка игры в полноэкранном альбомном режиме………………………………………………. 442

Создание классов для нового приложения…………………………………………………………… 443

О структуре приложения Live Drawing…………………………………………………………………………… 443

Написание кода класса LiveDrawingActivity…………………………………………………………………. 444

Написание кода класса LiveDrawingView……………………………………………………………………… 447

Добавление полей класса………………………………………………………………………………………. 449

Написание кода конструктора LiveDrawingView………………………………………………… 451

Написание кода метода draw………………………………………………………………………………… 453

Добавление метода printDebuggingText……………………………………………………………….. 454

Метод draw и класс SurfaceView…………………………………………………………………………… 455

Игровой цикл……………………………………………………………………………………………………………………………. 456

Потоки………………………………………………………………………………………………………………………………………. 458

Возможные проблемы с потоками………………………………………………………………………………….. 459

Реализация игрового цикла с помощью потока……………………………………………………………………. 462

Реализация Runnable и подготовка метода run…………………………………………………………….. 462

Написание кода потока…………………………………………………………………………………………………… 463

Запуск и остановка потока……………………………………………………………………………………………… 463

Использование жизненного цикла Activity для запуска и остановки потока……………… 464

Написание кода метода run……………………………………………………………………………………………. 464

Запуск приложения………………………………………………………………………………………………………………….. 467

Итоги…………………………………………………………………………………………………………………………………………. 468

Глава 22. Системы частиц и обработка касаний экрана……………………………………………….. 469

Технические требования…………………………………………………………………………………………………………. 469

Добавление пользовательских кнопок на экран…………………………………………………………………… 470

Реализация эффекта системы частиц…………………………………………………………………………………….. 470

Написание кода класса Particle……………………………………………………………………………………… 471

Написание кода класса ParticleSystem………………………………………………………………………….. 473

Создание систем частиц в классе LiveDrawingView……………………………………………………… 478

Обработка касаний………………………………………………………………………………………………………………….. 479

Написание кода метода onTouchEvent………………………………………………………………………….. 481

Завершение создания HUD……………………………………………………………………………………………… 482

Запуск приложения………………………………………………………………………………………………………………….. 483

Profiler: инструмент профилирования Android Studio………………………………………………………….. 484

Итоги…………………………………………………………………………………………………………………………………………. 487

Глава 23. Поддержка различных версий Android, звуковые эффекты
и виджет Spinner……………………………………………………………………………………………………………………… 488

Работа с разными версиями Android………………………………………………………………………………………. 488

Определение текущей версии Android……………………………………………………………………………. 489

Класс SoundPool……………………………………………………………………………………………………………………… 489

Инициализация SoundPool новым способом…………………………………………………………………. 490

Инициализация SoundPool старым способом……………………………………………………………….. 491

Загрузка звуковых файлов в память……………………………………………………………………… 491

Воспроизведение звука…………………………………………………………………………………………… 492

Остановка звука………………………………………………………………………………………………………. 493

Звуковое демонстрационное приложение и знакомство с виджетом Spinner……………………. 493

Создание звуковых эффектов………………………………………………………………………………………….. 493

Настройка звука………………………………………………………………………………………………………………. 496

Написание кода звукового демоприложения………………………………………………………………… 498

Итоги…………………………………………………………………………………………………………………………………………. 502

Глава 24. Шаблоны проектирования, множество компоновок и фрагменты…………….. 503

Технические требования…………………………………………………………………………………………………………. 503

Паттерн model-view-controller………………………………………………………………………………………………… 504

Рекомендации по дизайну приложений для Android…………………………………………………………….. 505

Реальные приложения……………………………………………………………………………………………………………… 506

Мини-приложение для обнаружения устройств…………………………………………………………………… 508

Написание кода класса MainActivity……………………………………………………………………………… 511

Разблокировка автоповорота экрана……………………………………………………………………. 512

Запуск приложения………………………………………………………………………………………………………….. 513

Квалификаторы конфигурации………………………………………………………………………………………………. 514

Ограничение квалификаторов конфигурации……………………………………………………………….. 516

Фрагменты………………………………………………………………………………………………………………………………… 517

Фрагменты: жизненный цикл………………………………………………………………………………………….. 517

Управление фрагментами с помощью FragmentManager…………………………………………….. 517

Наше первое приложение с Fragment……………………………………………………………………………………. 519

Проверка фрагмента в реальных условиях…………………………………………………………………………… 524

Часто задаваемые вопросы…………………………………………………………………………………………………….. 525

Итоги…………………………………………………………………………………………………………………………………………. 525

Глава 25. Создание приложения простой галереи изображений…………………………………… 526

Технические требования…………………………………………………………………………………………………………. 526

Классическое свайп-меню Angry Birds…………………………………………………………………………………… 526

Создание галереи изображений (слайдера)………………………………………………………………………….. 527

Реализация компоновки…………………………………………………………………………………………………… 528

Написание кода класса PagerAdapter……………………………………………………………………………. 529

Написание кода класса MainActivity……………………………………………………………………………… 531

Запуск приложения галереи……………………………………………………………………………………………. 533

Итог…………………………………………………………………………………………………………………………………………… 533

Глава 26. Расширенный пользовательский интерфейс с Navigation Drawer и Fragment 534

Технические требования…………………………………………………………………………………………………………. 534

Знакомство с NavigationView…………………………………………………………………………………………………. 535

Простое приложение базы данных………………………………………………………………………………………… 536

Insert………………………………………………………………………………………………………………………………….. 536

Delete…………………………………………………………………………………………………………………………………. 536

Search………………………………………………………………………………………………………………………………… 537

Results………………………………………………………………………………………………………………………………… 538

Реализация проекта Age Database………………………………………………………………………………………….. 538

Изучение автоматически сгенерированного кода и ресурсов…………………………………………….. 538

Написание кода классов Fragment и их компоновок……………………………………………………. 540

Создание пустых файлов для классов и компоновок……………………………………………………. 540

Написание классов………………………………………………………………………………………………………….. 540

Разработка компоновок…………………………………………………………………………………………………… 543

Разработка content_insert.xml…………………………………………………………………………………………. 543

Разработка content_delete.xml………………………………………………………………………………………… 543

Разработка content_search.xml……………………………………………………………………………………….. 544

Разработка content_results.xml……………………………………………………………………………………….. 545

Использование классов Fragment и их компоновок……………………………………………………………… 545

Редактирование меню Navigation Drawer……………………………………………………………………… 545

Добавление держателя к основной компоновке……………………………………………………………. 546

Написание кода класса MainActivity.java……………………………………………………………………… 547

Итоги…………………………………………………………………………………………………………………………………………. 550

Глава 27. Базы данных Android…………………………………………………………………………………………… 551

Технические требования…………………………………………………………………………………………………………. 551

Базы данных…………………………………………………………………………………………………………………………….. 552

Что такое база данных?…………………………………………………………………………………………………… 552

Что такое SQL?…………………………………………………………………………………………………………………. 552

Что такое SQLite?……………………………………………………………………………………………………………… 552

Учебник по синтаксису SQL……………………………………………………………………………………………………. 553

Пример кода SQLite………………………………………………………………………………………………………….. 553

Создание таблицы………………………………………………………………………………………………….. 553

Добавление данных в базу…………………………………………………………………………………….. 554

Получение данных из базы……………………………………………………………………………………. 554

Обновление структуры базы данных……………………………………………………………………. 555

Android SQLite API…………………………………………………………………………………………………………………… 555

SQLiteOpenHelper и SQLiteDatabase………………………………………………………………………………. 555

Создание и выполнение запросов…………………………………………………………………………………… 555

Курсоры базы данных…………………………………………………………………………………………………….. 557

Написание кода класса базы данных……………………………………………………………………………………. 558

Написание кода классов Fragment для использования класса DataManager……………………. 562

Запуск приложения Age Database………………………………………………………………………………………….. 565

Итоги…………………………………………………………………………………………………………………………………………. 567

Глава 28. Краткое напутствие перед расставанием…………………………………………………………. 568

Публикация приложения…………………………………………………………………………………………………………. 568

Создайте приложение!…………………………………………………………………………………………………………….. 569

Продолжайте учиться……………………………………………………………………………………………………………… 569

Продолжайте читать……………………………………………………………………………………………………….. 569

GitHub……………………………………………………………………………………………………………………………….. 570

Stack Overflow…………………………………………………………………………………………………………………… 570

Форумы пользователей Android……………………………………………………………………………………… 572

Обучение более высокого уровня…………………………………………………………………………………… 572

Каналы связи с автором………………………………………………………………………………………………………….. 572

До свидания и спасибо!…………………………………………………………………………………………………………… 573

Предметный указатель……………………………………………………………………………………………………………… 574

Джон Хортон — энтузиаст программирования и игр из Великобритании. У него страсть к написанию приложений, игр, книг и статей в блогах. Он является основателем Game Code School.

Опубликовано

Новая книга Дениса Колисниченко: “Командная строка Linux”

Командная строка Linux

В книге рассматриваются задачи, которые выполняются из командной строки операционной системы Linux. Объясняется, как попасть в командную строку, работать в консоли, настраивать систему с помощью программ, обладающих только текстовым интерфейсом. Описаны особенности файловой системы Linux, наиболее полезные команды для работы с текстом, сетью и Интернетом, а также команды системного администратора. Особое внимание уделено написанию сценариев автоматизации рутинных задач на языках командных оболочек bash и tcsh. Рассмотрены способы перенаправления ввода-вывода, маски и псевдонимы, различные варианты запуска программ, эффективные приемы использования клавиатуры, примеры сложных команд и другие вопросы.

Эффективная работа в командной строке Linux.

Настоящий линуксоид должен уметь работать в консоли, что требует определенной квалификации пользователя. Рассмотрены задачи, которые выполняются из командной строки Linux. Объясняется, как попасть в командную строку, работать в консоли, настраивать систему с помощью программ, обладающих только текстовым интерфейсом. Описаны особенности файловой системы Linux, наиболее полезные команды для работы с текстом, сетью и  Интернетом, а также команды системного администратора. Особое внимание уделено написанию сценариев автоматизации рутинных задач на языках командных оболочек bash и tcsh. Рассмотрены способы  перенаправления ввода-вывода, маски и псевдонимы, различные варианты запуска программ, эффективные приемы использования клавиатуры, примеры сложных команд и другие вопросы.

  • Работа в консоли
  • Автоматизация на языках оболочек bash и tcsh
  • Особенности файловой системы Linux
  • Управление процессами
  • Команды системного администратора
  • Команды для обработки текста и для работы в сети

Книгу “Командная строка Linux” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Глава 1. Как попасть в командную строку?…………………………………………….. 9

1.1. Переключаемся из графического режима в консоль………………………………………………………….. 9

1.2. Графические терминалы…………………………………………………………………………………………………….. 12

1.3. Удаленная консоль……………………………………………………………………………………………………………… 12

1.4. Завершение работы из консоли. Команды poweroff, halt, reboot, shutdown………………….. 14

Глава 2. Как работать в консоли?………………………………………………………….. 15

2.1. Ввод команд………………………………………………………………………………………………………………………… 15

2.2. Ввод/вывод и каналы………………………………………………………………………………………………………….. 16

2.3. Шесть полезных команд…………………………………………………………………………………………………….. 17

2.3.1. Команда wc……………………………………………………………………………………………………………………. 17

2.3.2. Команда head………………………………………………………………………………………………………………… 18

2.3.3. Команда cut…………………………………………………………………………………………………………………… 19

2.3.4. Команда grep…………………………………………………………………………………………………………………. 19

2.3.5. Команда sort………………………………………………………………………………………………………………….. 20

2.3.6. Команда uniq…………………………………………………………………………………………………………………. 21

Глава 3. Оболочка bash………………………………………………………………………….. 23

3.1. Маски имен файлов…………………………………………………………………………………………………………….. 23

3.2. Переменные окружения………………………………………………………………………………………………………. 24

3.3. Псевдонимы…………………………………………………………………………………………………………………………. 25

3.4. Изменение приглашения командной строки…………………………………………………………………….. 25

3.5. Еще раз о перенаправлении ввода/вывода………………………………………………………………………. 26

3.6. Пробелы в именах файлов………………………………………………………………………………………………….. 28

3.7. Инициализация переменных………………………………………………………………………………………………. 29

3.8. Просмотр истории команд…………………………………………………………………………………………………. 29

3.9. Вызов предыдущих команд……………………………………………………………………………………………….. 30

3.10. Защита от случайного удаления файла…………………………………………………………………………. 30

3.11. Использование последнего вывода команды…………………………………………………………………. 31

3.12. Редактирование командной строки…………………………………………………………………………………. 31

Глава 4. Файловая система. Команды для работы с файловой системой… 33

4.1. Особенности файловой системы Linux……………………………………………………………………………… 33

4.1.1. Имена файлов в Linux…………………………………………………………………………………………………… 33

4.1.2. Файлы и устройства……………………………………………………………………………………………………… 33

4.1.3. Корневая файловая система и монтирование…………………………………………………………….. 34

4.1.4. Стандартные каталоги Linux………………………………………………………………………………………. 35

4.2. Команды для работы с файлами и каталогами……………………………………………………………….. 36

4.2.1. Работа с файлами………………………………………………………………………………………………………….. 36

4.2.2. Работа с каталогами…………………………………………………………………………………………………….. 39

4.2.3. Удобная навигация по файловой системе…………………………………………………………………… 41

4.3. Команда ln: создание ссылок…………………………………………………………………………………………….. 44

4.4. Команды chmod, chown и chattr…………………………………………………………………………………………. 45

4.4.1. Команда chmod: права доступа к файлам и каталогам…………………………………………….. 45

4.4.2. Команда chown: смена владельца файла…………………………………………………………………… 47

4.4.3. Специальные права доступа (SUID и SGID)………………………………………………………………. 47

4.4.4. Команда chattr: атрибуты файла, запрет изменения файла……………………………………… 48

4.5. Монтирование файловых систем………………………………………………………………………………………. 49

4.5.1. Команды mount и umount……………………………………………………………………………………………… 49

4.5.2. Файлы устройств и монтирование………………………………………………………………………………. 50

Жесткие диски………………………………………………………………………………………………………………….. 50

Приводы оптических дисков…………………………………………………………………………………………… 52

Дискеты…………………………………………………………………………………………………………………………….. 52

Флешки и внешние жесткие диски………………………………………………………………………………….. 53

4.5.3. Опции монтирования файловых систем……………………………………………………………………… 53

4.5.4. Монтирование разделов при загрузке………………………………………………………………………… 54

4.5.5. Подробно о UUID и файле /etc/fstab……………………………………………………………………………. 56

4.5.6. Монтирование флешек…………………………………………………………………………………………………. 59

4.6. Настройка журнала файловой системы ext3…………………………………………………………………… 59

4.7. Файловая система ext4……………………………………………………………………………………………………….. 60

4.7.1. Сравнение ext3 и ext4…………………………………………………………………………………………………… 61

4.7.2. Совместимость с ext3……………………………………………………………………………………………………. 62

4.8. Особые команды…………………………………………………………………………………………………………………. 62

4.8.1. Команда mkfs: создание файловой системы……………………………………………………………….. 62

4.8.2. Команда fsck: проверка и восстановление файловой системы…………………………………. 62

4.8.3. Команда chroot: смена корневой файловой системы………………………………………………… 63

4.8.4. Установка скорости CD/DVD………………………………………………………………………………………. 63

4.8.5. Монтирование каталога к каталогу……………………………………………………………………………. 64

4.8.6. Команды поиска файлов………………………………………………………………………………………………. 64

4.9. Многофункциональная команда dd………………………………………………………………………………….. 65

4.9.1. Копирование файлов с помощью команды dd……………………………………………………………. 66

4.9.2. Разделение файла на несколько частей………………………………………………………………………. 67

4.9.3. Создание резервной копии жесткого диска………………………………………………………………… 67

4.9.4. Создание архива с резервной копией всего жесткого диска…………………………………….. 67

4.9.5. Уничтожение всех данных раздела жесткого диска………………………………………………….. 68

4.10. Команда du………………………………………………………………………………………………………………………… 68

Глава 5. Процессы…………………………………………………………………………………. 70

5.1. Оболочки, команды и программы……………………………………………………………………………………… 70

5.2. Родительский и дочерний процессы………………………………………………………………………………….. 71

5.3. Команды kill, killall, xkill и ps…………………………………………………………………………………………….. 72

5.4. Программа top: кто больше всех расходует процессорное время?……………………………….. 74

5.5. Команды nice и renice: изменение приоритета процесса………………………………………………… 76

5.6. Команда fuser: кто открыл ресурс?…………………………………………………………………………………… 77

Глава 6. Различные способы выполнения команд…………………………………. 78

6.1. Списки………………………………………………………………………………………………………………………………….. 78

6.1.1. Условные списки…………………………………………………………………………………………………………… 78

6.1.2. Безусловные списки………………………………………………………………………………………………………. 79

6.2. Подстановка………………………………………………………………………………………………………………………… 80

6.2.1. Подстановка команды………………………………………………………………………………………………….. 80

6.2.2. Подстановка процесса………………………………………………………………………………………………….. 81

6.3. Команда как строка……………………………………………………………………………………………………………. 82

6.3.1. Передача команды в виде аргумента………………………………………………………………………….. 82

6.3.2. Перенаправление команды на стандартный ввод bash…………………………………………….. 82

6.4. Удаленное выполнение команды по SSH…………………………………………………………………………. 83

6.5. Фоновое выполнение команд…………………………………………………………………………………………….. 83

Глава 7. Некоторые полезные команды…………………………………………………. 85

7.1. Команда seq…………………………………………………………………………………………………………………………. 85

7.2. Фигурные скобки…………………………………………………………………………………………………………………. 86

7.3. Команда find……………………………………………………………………………………………………………………….. 86

Глава 8. Команды для работы с текстом………………………………………………… 88

8.1. Команда sort: сортировка файлов…………………………………………………………………………………….. 88

8.2. Команда diff: сравнение файлов……………………………………………………………………………………….. 88

8.3. Команда diff3: сравнение трех файлов…………………………………………………………………………….. 89

8.4. Команда cmp: сравнение двух файлов……………………………………………………………………………… 90

8.5. Команда comm: еще одна команда для сравнения файлов……………………………………………… 90

8.6. Команда column: разбивка текста на столбцы………………………………………………………………… 91

8.7. Команда egrep: расширенный текстовый фильтр……………………………………………………………. 91

8.8. Команда expand: замена символов табуляции пробелами…………………………………………….. 92

8.9. Команда fmt…………………………………………………………………………………………………………………………. 93

8.10. Команда fold……………………………………………………………………………………………………………………… 93

8.11. Команда grep: текстовый фильтр……………………………………………………………………………………. 93

8.12. Команды more и less: постраничный вывод……………………………………………………………………. 94

8.13. Команды head и tail: вывод начала и хвоста файла……………………………………………………… 94

8.14. Команда look…………………………………………………………………………………………………………………….. 94

8.15. Команда split: разбиение файлов на несколько частей………………………………………………… 94

8.16. Команда unexpand: замена пробелов символами табуляции………………………………………. 95

8.17. Команды vi, nano, ee, mcedit, pico: текстовые редакторы……………………………………………… 95

8.18. Команда sed: потоковый текстовый редактор……………………………………………………………….. 99

8.19. Команда wc: подсчет слов в файле……………………………………………………………………………….. 100

8.20. Некоторые команды преобразования символов и форматов……………………………………… 101

Глава 9. Эффективное использование клавиатуры………………………………. 102

9.1. Работа с окнами………………………………………………………………………………………………………………… 102

9.2. Доступ к веб-браузерам из командной строки……………………………………………………………….. 104

9.3. Работаем с буфером обмена…………………………………………………………………………………………….. 106

Глава 10. Команды для работы с сетью и Интернетом…………………………. 107

10.1. Команда ifconfig: управление сетевыми интерфейсами……………………………………………… 107

10.2. Маршрутизация………………………………………………………………………………………………………………. 109

10.2.1. Команда netstat: просмотр таблицы маршрутизации и другой
сетевой информации…………………………………………………………………………………………………………….. 109

10.2.2. Команда route: изменение таблицы маршрутизации……………………………………………. 113

10.3. Команды получения информации об узле……………………………………………………………………. 116

10.3.1. Получение информации о доменном имени……………………………………………………………. 116

10.3.2. Команды host и dig……………………………………………………………………………………………………. 116

10.3.3. Утилита DMitry…………………………………………………………………………………………………………. 118

10.4. Текстовые браузеры……………………………………………………………………………………………………….. 118

10.5. Команда ftp: FTP-клиент………………………………………………………………………………………………… 118

10.6. Команда wget: загрузка файлов…………………………………………………………………………………….. 120

10.7. Команды для диагностики сети…………………………………………………………………………………….. 121

10.8. Команда ssh…………………………………………………………………………………………………………………….. 125

10.9. Сетевой сканер nmap………………………………………………………………………………………………………. 127

10.9.1. Что такое nmap?………………………………………………………………………………………………………… 127

10.9.2. Где мне взять nmap?…………………………………………………………………………………………………. 128

10.9.3. Примеры использования nmap………………………………………………………………………………… 128

Глава 11. Команды системного администратора………………………………….. 131

11.1. Программы разметки диска……………………………………………………………………………………………. 131

11.1.1. Программа fdisk………………………………………………………………………………………………………… 131

11.1.2. Программа parted……………………………………………………………………………………………………… 134

11.1.3. Добавление диска на виртуальном сервере…………………………………………………………… 138

11.1.4. Расширение существующего диска…………………………………………………………………………. 141

11.1.5. Несколько слов о GPT. Утилиты для работы с GPT………………………………………………. 144

11.2. Информация о системе и пользователях………………………………………………………………………. 145

11.2.1. Команда uptime: информация о работе системы…………………………………………………… 145

11.2.2. Команда users: информация о пользователях………………………………………………………… 145

11.2.3. Команды w, who, ftpwho и whoami: информация о пользователях………………………. 146

11.2.4. Мониторинг работы системы………………………………………………………………………………….. 147

11.3. Планировщик at………………………………………………………………………………………………………………. 149

11.3.1. Команда at: добавление задания…………………………………………………………………………….. 149

11.3.2. Команды atq и atrm: очередь заданий и удаление задания………………………………….. 149

11.4. Планировщик crond………………………………………………………………………………………………………… 150

11.5. Команда date: вывод и установка даты и времени……………………………………………………… 151

11.6. Команды free и df: информация о системных ресурсах………………………………………………. 152

Глава 12. Автоматизация рутинных задач с помощью оболочки bash….. 153

12.1. Настройка bash……………………………………………………………………………………………………………….. 153

12.2. Автоматизация задач с помощью сценариев bash………………………………………………………. 154

12.3. Привет, мир!…………………………………………………………………………………………………………………….. 154

12.4. Использование переменных в собственных сценариях………………………………………………. 155

12.5. Передача параметров сценарию…………………………………………………………………………………… 156

12.6. Массивы и bash……………………………………………………………………………………………………………….. 157

12.7. Циклы……………………………………………………………………………………………………………………………….. 157

12.8. Условные операторы……………………………………………………………………………………………………… 158

12.9. Функции…………………………………………………………………………………………………………………………… 160

12.10. Примеры сценариев………………………………………………………………………………………………………. 160

12.10.1. Сценарий мониторинга журнала………………………………………………………………………….. 160

12.10.2. Переименование файлов………………………………………………………………………………………… 161

12.10.3. Преобразование систем счисления……………………………………………………………………….. 161

12.10.4. Проверка прав пользователя…………………………………………………………………………………. 162

12.10.5. Генератор имени временного файла…………………………………………………………………….. 162

12.10.6. Проверка свободного дискового пространства с уведомлением
по электронной почте…………………………………………………………………………………………………………… 163

Глава 13. Полезные примеры……………………………………………………………….. 164

13.1. Поиск дубликатов файлов……………………………………………………………………………………………… 164

13.2. Сценарий scanner……………………………………………………………………………………………………………. 165

13.3. Изменение прав доступа к файлам и каталогам………………………………………………………….. 166

13.4. Аварийный перезапуск сервисов…………………………………………………………………………………… 166

13.4.1. Проверка работоспособности веб-сервера…………………………………………………………….. 166

13.4.2. Проверка работоспособности MySQL……………………………………………………………………. 167

13.4.3. Если «падают» процессы…………………………………………………………………………………………. 167

13.5. Поиск битых ссылок с помощью AWK………………………………………………………………………….. 168

13.6. Считаем количество файлов в папке и подпапках………………………………………………………. 169

13.7. Резервное копирование базы данных……………………………………………………………………………. 169

Предметный указатель…………………………………………………………………………. 171

Денис_Николавич_Колисниченко

Колисниченко Денис Николаевич, инженер-программист и системный администратор. Имеет богатый опыт эксплуатации и создания локальных сетей от домашних до уровня предприятия, разработки приложений для различных платформ. Автор более 50 книг компьютерной тематики, в том числе “Microsoft Windows 10. Первое знакомство”, “Самоучитель Microsoft Windows 8”, “Программирование для Android 5. Самоучитель”, “PHP и MySQL. Разработка веб-приложений”, “Планшет и смартфон на базе Android для ваших родителей”, “”Linux. От новичка к профессионалу” и др.

Опубликовано

Интерпретируемое машинное обучение на Python

Интерпретируемое машинное обучение на Python

Представляем книгу Серга Масиса “Интерпретируемое машинное обучение на Python”.

Книга поможет осознанно и эффективно работать с моделями машинного обучения. Дано введение в интерпретацию машинного обучения: раскрыты важность темы, ее ключевые понятия и проблемы. Рассмотрены методы интерпретации: модельно-агностические, якорные и контрфактические, для многопеременного прогнозирования, а также  визуализации сверточных нейронных сетей. Раскрыты вопросы настройки на интерпретируемость: отбор и конструирование признаков, ослабление систематического смещения и причинно-следственный вывод, монотонные ограничения, настройка моделей и устойчивость к антагонизму. Показаны перспективы развития интерпретируемых моделей машинного обучения. Каждая глава книги включает подробные примеры исходного кода на языке Python.

На сайте издательства размещен архив с цветными иллюстрациями.

О чем эта книга

Эта книга поможет вам эффективно работать с моделями машинного обучения. Каждая глава включает подробные примеры исходного кода на языке Python.

Первый раздел книги представляет собой руководство для начинающих по интерпретации результатов моделирования. В нем даны основные понятия и проблемы, показано значение машинного обучения в бизнесе. Рассмотрены модели белого ящика, черного ящика и стеклянного ящика, проведено их сравнение и предложены разумные компромиссы.

Во втором разделе описан широкий спектр методов интерпретации, известных также как методы объяснимого искусственного интеллекта, и их применение в случаях  классификации, регрессии, табличных временных рядов, обработки изображений или текста. Результаты моделирования сопровождаются программными кодами и понятными примерами.

В третьем разделе рассмотрена настройка моделей и работа с обучающими данными. При этом интерпретируемость обеспечивается за счет снижения сложности, ослабления систематического смещения и повышения надежности. Рассмотрены новейшие методы выбора признаков, монотонных ограничений, состязательного переобучения и др.

К концу этой книги вы сможете лучше понимать модели машинного обучения и улучшать их за счет настройки интерпретируемости.

Для кого эта книга предназначена

  • для новичков и студентов, изучающих науку о данных, обладающих основополагающими знаниями машинного обучения и языка программирования Python;
  • для профессионалов по работе с данными, на которых возлагается все более важная ответственность в объяснении хода работы систем ИИ, которые они разрабатывают и чью работу они сопровождают технически;
  • для инженеров по машинному обучению и исследователей данных, которые хотят расширить свой набор навыков, включив в него новейшие методы интерпретации и способы уменьшения систематических ошибок;
  • для специалистов по этике ИИ, чтобы углубить свое понимание имплементационных сторон своей работы в целях более эффективного ориентирования этих усилий;
  • для менеджеров проектов ИИ и руководителей компаний, которые хотят внедрить интерпретируемое машинное обучение в свои производственные процессы, чтобы соответствовать принципам объективности, подотчетности и прозрачности.

    Вы изучите:

    • Проблемы интерпретируемости в бизнесе
    • Внутренне интерпретируемые модели, такие как линейные модели, деревья решений и наивный байесовский метод
    • Интерпретацию моделей с помощью методов, не зависящих от модели
    • Работу классификатора изображений
    • Методы ослабления систематического смещения
    • Методы защиты моделей от атак
    • Применение монотонных ограничений для повышения безопасности моделей

Книгу “Интерпретируемое машинное обучение на Python” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Об авторе. 15

О рецензентах. 17

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

Для кого эта книга предназначена. 20

Что эта книга охватывает. 21

Как получить максимальную отдачу от этой книги. 23

Загрузка файлов с исходным кодом.. 24

Загрузка цветных изображений. 25

Используемые условные обозначения. 25

Часть I. Введение в интерпретацию машинного обучения. 27

Глава 1. Интерпретация, интерпретируемость и объяснимость:
почему всё это важно?. 29

Технические требования. 30

Что такое интерпретация машинного обучения?. 30

Изучение простой модели предсказания веса. 31

Понимание разницы между интерпретируемостью и объяснимостью.. 37

Что такое интерпретируемость?. 37

Что такое объяснимость?. 40

Деловое обоснование интерпретируемости. 42

Более качественные решения. 42

Более надежные бренды.. 44

Более высокий уровень этичности. 46

Более высокая прибыльность. 49

Резюме. 50

Источники изображений. 50

Справочные материалы.. 50

Глава 2. Ключевые понятия интерпретируемости. 52

Технические требования. 52

Миссия. 52

Подробности о сердечно-сосудистых заболеваниях. 53

Подход. 54

Подготовительные работы.. 54

Загрузка библиотек. 54

Изучение проблемы и подготовка данных. 54

Ознакомление с типами методов интерпретации и диапазонами интерпретируемости  57

Типы методов модельной интерпретации. 61

Диапазоны модельной интерпретируемости. 61

Интерпретирование отдельных предсказаний с помощью логистической регрессии  62

Оценивание препятствий, мешающих интерпретируемости результатов машинного обучения  67

Нелинейность. 69

Интерактивность. 72

Немонотонность. 72

Миссия выполнена. 74

Резюме. 75

Справочные материалы.. 75

Глава 3. Трудности интерпретации. 76

Технические требования. 76

Миссия. 76

Подход. 78

Подготовительные работы.. 78

Загрузка библиотек. 78

Изучение проблемы и подготовка данных. 79

Обзор традиционных методов модельной интерпретации. 84

Предсказывание минут задержки с помощью различных
регрессионных методов. 84

Классифицирование рейсов как задержанных либо незадержанных
с использованием различных классификационных методов. 89

Визуализация задержанных рейсов с помощью методов понижения размерности  96

Ограничения традиционных методов модельной интерпретации. 102

Изучение имманентно интерпретируемых моделей (типа белого ящика) 103

Обобщенные линейные модели. 103

Деревья решений. 118

RuleFit 123

Метод ближайших соседей. 125

Наивный Байес. 127

Распознавание компромисса между результативностью
и интерпретируемостью.. 130

Особые модельные свойства. 130

Диагностика результативности. 131

Обнаружение более новых интерпретируемых (аквариумных) моделей. 134

Объяснимая бустинговая машина. 134

Skoped-Rules. 138

Миссия выполнена. 140

Резюме. 141

Источник набора данных. 141

Справочные материалы.. 142

Часть II. Освоение методов интерпретации. 143

Глава 4. Основы важности признаков и их влияние. 145

Технические требования. 145

Миссия. 146

Личность и очередность рождения. 146

Подход. 147

Подготовительные работы.. 147

Загрузка библиотек. 147

Изучение проблемы и подготовка данных. 148

Как измерить влияние признака на исход. 150

Важность признаков в древовидных моделях. 154

Важность признаков в логистической регрессии. 156

Важность признаков в линейном дискриминантном анализе. 159

Важность признаков в многослойном персептроне. 161

Применение перестановочной важности признаков на практике. 162

Недостатки метода перестановочной важности признаков. 165

Интерпретирование графиков частичной зависимости. 166

Интеракционные графики частичной зависимости. 171

Недостатки графиков частичной зависимости. 174

Объяснение графиков индивидуального условного ожидания. 174

Недостатки графиков индивидуального условного ожидания. 179

Миссия выполнена. 179

Резюме. 180

Источник набора данных. 180

Справочные материалы.. 180

Глава 5. Модельно-агностические методы глобальной интерпретации. 182

Технические требования. 182

Миссия. 183

Подход. 184

Подготовительные работы.. 185

Загрузка библиотек. 185

Изучение проблемы и подготовка данных. 186

Значения Шепли. 196

Интерпретирование сводки SHAP и графиков зависимости. 198

Генерирование сводных графиков SHAP. 202

Изучение взаимодействий. 204

Графики зависимости SHAP. 207

Силовые графики SHAP. 215

Графики накопленных локальных эффектов. 217

Глобальные суррогаты.. 221

Подгонка суррогатов. 221

Оценивание суррогатов. 222

Интерпретирование суррогатов. 223

Миссия выполнена. 225

Резюме. 225

Справочные материалы.. 226

Глава 6. Модельно-агностические методы локальной интерпретации. 227

Технические требования. 227

Миссия. 227

Подход. 228

Подготовительные работы.. 229

Загрузка библиотек. 229

Изучение проблемы и подготовка данных. 230

Задействование ядерного объяснителя SHAP для локальных интерпретаций
со значениями SHAP. 236

Обучение модели C-SVC.. 237

Вычисление значений SHAP с помощью ядерного объяснителя. 239

Локальная интерпретация для группы предсказаний с использованием графиков решений  241

Локальная интерпретация по одному предсказанию за раз
с использованием силового графика. 244

Применение локально интерпретируемых модельно-агностических
объяснений. 247

Что такое LIME?. 247

Локальная интерпретация по одному предсказанию за раз
с использованием табличного объяснителя на основе LIME. 249

Использование метода LIME для NLP. 251

Обучение модели LightGBM.. 253

Локальная интерпретация по одному предсказанию за раз
с использованием текстового объяснителя на основе LIME. 254

Опробование SHAP в обработке естественного языка. 257

Сравнение SHAP с LIME. 260

Миссия выполнена. 261

Резюме. 262

Источник набора данных. 262

Справочные материалы.. 262

Глава 7. Якорные и контрфактические объяснения. 264

Технические требования. 264

Миссия. 264

Необъективная смещенность в диагностиках риска рецидивизма. 266

Подход. 267

Подготовительные работы.. 267

Загрузка библиотек. 267

Изучение проблемы и подготовка данных. 268

Якорные объяснения. 278

Подготовительные работы для якорных и контрафактических
объяснений с помощью библиотеки alibi 279

Локальные интерпретации якорных объяснений. 281

Анализ контрфактических объяснений. 284

Контрфактические объяснения под руководством прототипов. 285

Получение контрфактических экземпляров и многого другого
с помощью инструмента What-If Tool (WIT) 289

Сравнение с помощью метода контрастивного объяснения. 299

Миссия выполнена. 303

Резюме. 304

Источник набора данных. 304

Справочные материалы.. 304

Глава 8. Визуализация сверточных нейронных сетей. 306

Технические требования. 306

Миссия. 307

Подход. 308

Подготовительные работы.. 309

Загрузка библиотек. 309

Изучение проблемы и подготовка данных. 310

Диагностика CNN-классификатора традиционными методами интерпретации  315

Визуализирование процесса усвоения с помощью активационных методов. 323

Промежуточные активации. 325

Максимизация активации. 328

Оценивание ошибочных классификаций с помощью градиентных методов атрибуции  332

Карты значимости. 333

Метод градиентных карт активаций классов Grad-CAM.. 336

Интегрированные градиенты.. 338

Окончательная сборка. 341

Объяснение классификаций с помощью пертурбационных методов
атрибуции. 344

Окклюзивная чувствительность. 344

Объяснитель изображений методом LIME. 347

Метод контрастивных объяснений. 349

Окончательная сборка. 354

Бонусный метод: глубокий объяснитель SHAP. 357

Миссия выполнена. 358

Резюме. 359

Источники данных и изображений. 359

Справочные материалы.. 360

Глава 9. Методы интерпретации для многопеременного
прогнозирования и анализа чувствительности. 361

Технические требования. 362

Миссия. 362

Подход. 364

Подготовительные работы.. 365

Загрузка библиотек. 365

Изучение проблемы и подготовка данных. 366

Диагностика моделей временного ряда с использованием традиционных методов интерпретации  375

Использование стандартных регрессионных метрик. 376

Агрегации предсказательных ошибок. 378

Оценивание как классификационная задача. 380

Генерирование LSTM-атрибуций с помощью интегрированных градиентов. 381

Вычисление глобальных и локальных атрибуций с помощью ядерного объяснителя SHAP  387

Зачем использовать ядерный объяснитель?. 387

Определение стратегии, позволяющей работать с моделью многопеременного временного ряда  388

Заложение основы для стратегии аппроксимации перестановок. 389

Выявление влияющих признаков с помощью факторной приоритизации. 394

Вычисление индексов чувствительности Морриса. 395

Анализирование элементарных эффектов. 398

Квантифицирование неопределенности и стоимостной чувствительности
с помощью фиксирования факторов. 401

Генерирование и предсказывание на образцах Сальтелли. 402

Выполнение анализа чувствительности по методу Соболя. 403

Встраивание реалистичной функции стоимости. 405

Миссия выполнена. 409

Резюме. 410

Источники данных и изображений. 411

Справочные материалы.. 411

Часть III. Настройка на интерпретируемость. 413

Глава 10. Отбор и конструирование признаков для обеспечения интерпретируемости  415

Технические требования. 416

Миссия. 416

Подход. 417

Подготовительные работы.. 418

Загрузка библиотек. 418

Изучение проблемы и подготовка данных. 419

Изучение эффекта нерелевантных признаков. 420

Построение базовой модели. 421

Оценивание модели. 422

Обучение базовой модели на разных максимальных глубинах. 425

Обзор фильтрационных методов отбора признаков. 427

Базовые фильтрационные методы.. 428

Корреляционные фильтрационные методы.. 430

Ранжирующие фильтрационные методы.. 432

Сравнение фильтрационных методов. 434

Анализ встроенных методов отбора признаков. 435

Раскрытие потенциала оберточных, гибридных и продвинутых методов
отбора признаков. 439

Оберточные методы.. 439

Гибридные методы.. 441

Продвинутые методы.. 443

Оценивание всех моделей, построенных с применением отбора
признаков. 445

Обзор конструирования признаков. 447

Миссия выполнена. 455

Резюме. 457

Источники наборов данных. 457

Справочные материалы.. 457

Глава 11. Ослабление систематического смещения
и причинно-следственный вывод. 459

Технические требования. 460

Миссия. 460

Подход. 461

Подготовительные работы.. 462

Загрузка библиотек. 462

Изучение проблемы и подготовка данных. 463

Обнаружение систематического смещения. 467

Визуализирование систематического смещения набора данных. 469

Квантифицирование систематического смещения набора данных. 472

Квантифицирование систематического смещения модели. 476

Ослабление систематического смещения. 479

Методы ослабления систематического смещения стадии
предварительной обработки. 480

Методы ослабления систематического смещения стадии
промежуточной обработки. 487

Методы ослабления систематического смещения стадии
последующей обработки. 490

Окончательная сборка. 493

Построение причинно-следственной модели. 495

Изучение результатов эксперимента. 497

Изучение причинно-следственных моделей. 500

Инициализация линейного дважды устойчивого ученика. 502

Обучение причинно-следственной модели. 502

Гетерогенные эффекты экспериментальной процедуры.. 503

Выбор политики. 507

Проверка устойчивости оценки. 510

Добавление случайной общей причины.. 510

Замена экспериментальной процедуры случайной переменной. 511

Миссия выполнена. 512

Резюме. 513

Источник набора данных. 513

Справочные материалы.. 513

Глава 12. Монотонные ограничения и настройка моделей
на интерпретируемость. 515

Технические требования. 516

Миссия. 516

Подход. 518

Подготовительные работы.. 518

Загрузка библиотек. 519

Изучение проблемы и подготовка данных. 519

Установка ограничений с помощью конструирования признаков. 522

Упорядочение. 523

Дискретизация. 525

Члены взаимодействия и нелинейные преобразования. 526

Категориальное кодирование. 530

Другие подготовительные работы.. 531

Настройка моделей на интерпретируемость. 532

Настройка нейронной сети Keras. 533

Настройка других популярных модельных классов. 536

Оптимизация под объективность с помощью байесовой гиперпараметрической настройки и прикладных метрик. 544

Имплементирование модельных ограничений. 550

Ограничения в XGBoost 551

Ограничения в TensorFlow Lattice. 556

Миссия выполнена. 563

Резюме. 564

Источник набора данных. 565

Справочные материалы.. 565

Глава 13. Устойчивость к антагонизму. 566

Технические требования. 567

Миссия. 567

Подход. 569

Подготовительные работы.. 569

Загрузка библиотек. 569

Изучение проблемы и подготовка данных. 570

Загрузка базовой модели CNN.. 573

Диагностика базового классификатора CNN.. 575

Эвазивные атаки. 576

Атака быстрым методом на основе знака градиента. 578

Атака методом инфинитной нормы Карлини и Вагнера. 581

Целенаправленная атака методом антагонистических заплат. 583

Защита от целенаправленных атак с помощью предобработки. 585

Защита от любой эвазивной атаки с помощью антагонистического
обучения устойчивого классификатора. 590

Оценивание и сертифицирование устойчивости к антагонизму. 595

Сравнение устойчивости модели с силой атаки. 595

Сертифицирование устойчивости с помощью рандомизированного сглаживания  597

Миссия выполнена. 604

Резюме. 605

Источники наборов данных. 605

Справочные материалы.. 606

Глава 14. Интерпретируемость машинного обучения: что дальше?. 607

Современное состояние интерпретируемости машинного обучения. 607

Связываем всё воедино! 607

Текущие тренды.. 612

Размышления о будущем интерпретируемости машинного обучения. 614

Новое видение машинного обучения. 615

Междисциплинарный подход. 616

Соответствующая требованиям стандартизация. 616

Исполнение регуляторных предписаний. 616

Бесшовная автоматизация машинного обучения со встроенной интерпретацией  617

Более тесная интеграция с инженерами MLOps. 617

Справочные материалы.. 618

Предметный указатель. 619

Об авторе

Serg Masís

Серг Масис (Serg Masís) в течение последних двух десятилетий трудится на стыке веб-разработки, разработки приложений и аналитики. В настоящее время он является специалистом по климатическим и агрономическим данным в Syngenta, веду- щей агробизнес-компании с миссией по улучшению глобальной продовольственной безопасности. До этого стал одним из основателей стартапа, созданного Harvard Innovation Labs, который объединил возможности облачных вычислений и машинного обучения с принципами из науки принятия решений, чтобы знакомить пользователей с новыми местами и событиями. Независимо от того, к чему это относится: к досугу, болезням растений или пожизненной ценности клиента, — Серг увлечен нахождением часто недостающих связей между данными  и процессом принятия решений, и интерпретация результатов работы моделей машинного обучения эффективно помогает преодолевать этот разрыв.

Я рад, что моя книга получила 4,5 звезды в Goodreads и 4,7 в Amazon , а также следующие награды:и «Лучшая книга об искусственном интеллекте  всех времен» от Book Authority.

Опубликовано

Новинка! “Java. Состояние языка и его перспективы”

Java. Состояние языка и его перспективы

Книга о современном состоянии языка Java, векторе его развития, а также о грамотном программировании в духе паттернов GoF. Книга дает базовое представление о фреймворке Spring, контейнерах Docker, принципах ООП, затрагивая, в частности, переход к облачным решениям, обращение с IDE. Также освещены темы из enterprise-разработки: файловый ввод/вывод NIO2, многопоточность, локализация, интеграция и оптимизация производительности. В книге отражено состояние языка по состоянию на версию Java 17 с разбором некоторых аспектов Java 18.

Будет интересна специалистам, возвращающимся к работе с Java после перерыва, бэкенд-разработчикам, читателям, готовящимся к сертификационным экзаменам.

Изучив предложенные примеры, Вы:

  • познакомитесь с объектно-ориентированным программированием на Java;
  • основами фреймворка Spring;
  • контейнерами Docker;
  • структурами данных;
  • идиомами программирования.

Язык Java более 20 лет занимает ведущие позиции в программировании для больших предприятий, бэкенд-разработке, банковском секторе, распределенных вычислениях. Java – ключевой язык для программирования под Android, несмотря на растущую популярность Kotlin. Виртуальная машина Java (JVM) является платформой для множества сложных и востребованных языков, прежде всего, Kotlin и Scala. Наконец, именно Java и его крупный фреймворк Spring наиболее отвечают современным вызовам, связанным с облачными и бессерверными вычислениями.  При этом в последние 5-6 лет экосистема Java меняется на глазах. В области Enterprise-разработки открыто соперничают Java EE и Jakarta EE. Каденция версий Java ускорилась, и новая мажорная версия теперь выходит примерно раз в полгода. Естественно, приходится поддерживать и актуализировать массу legacy-кода, где в лучшем случае реализованы возможности Java 8, например, лямбда-выражения.

Не будет преувеличением сказать, что в наше время даже при изучении Java с нуля необходимо держать в уме это беспокойное наследство. Типичная книга об очередной новой версии Java устареет раньше, чем выйдет из типографии. Именно поэтому давно назрела необходимость в такой книге, как эта. В ней вы усвоите основы языка, познакомитесь с принципами его версионирования и расширяемости, а также рассмотрите магистральные векторы его развития. Новейший материал книги в основном ограничен Java 17, но также затрагивает некоторые аспекты Java 18.

Нет фото

Федор Урванов обладает более чем тринадцатилетним опытом профессионального программирования. Обладает сертификатами 1Z0-803 (Oracle Certified Associate, Java SE 7 Programmer) и 1Z0-804 (Oracle Certified Professional, Java SE 7 Programmer), 7 лет ведёт блог по разработке программного обеспечения https://urvanov.ru, имеет богатый опыт коммерческой разработки на Java, участвовал в разработке программного обеспечения для нескольких крупнейших банков России.

Книгу “Java. Состояние языка и его перспективы” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Глава 1. Введение………………………………………… 7

1.1. Для кого эта книга……………………………………….. 7

1.2. Что понадобится…………………………………………. 7

1.3. Первая программа………………………………………. 8

1.4. Задания…………………………………………………… 11

Глава 2. Переменные…………………………………. 11

2.1. Типы переменных……………………………………… 11

2.2. Соглашение об именовании переменных…………. 13

2.3. Типы данных……………………………………………. 13

2.4. Значения по умолчанию………………………………. 14

2.5. Литералы………………………………………………… 15

2.6. Целочисленные литералы……………………………. 15

2.7. Литералы с плавающей точкой……………………… 16

2.8. Символьные и строковые литералы……………….. 17

2.9. Другие литералы……………………………………….. 18

2.10. Массивы……………………………………………….. 19

2.11. Задания…………………………………………………. 20

Глава 3. Операции……………………………………… 21

3.1. Операция присваивания……………………………… 21

3.2. Преобразование примитивных типов………………. 22

3.3. Расширяющее преобразование примитивов……… 22

3.4. Сужающее преобразование примитивов………….. 23

3.5. Арифметические операции…………………………… 24

3.6. Унарные операции…………………………………….. 26

3.7. Отличие постфиксного и префиксного инкремента и декремента            27

3.8. Операции сравнения………………………………….. 28

3.9. Логические И и ИЛИ…………………………………… 29

3.10. Операция instanceof…………………………………. 29

3.11. Тернарная операция…………………………………. 31

3.12. Битовые операции……………………………………. 31

3.13. Присвоение с выполнением другой операции….. 32

3.14. Приоритеты операций……………………………….. 33

3.15. Задания…………………………………………………. 34

Глава 4. Выражения, инструкции и блоки……. 35

4.1. Операторы управления порядком выполнения….. 36

4.2. Операторы if-then и if-then-else……………………… 37

4.3. Оператор switch………………………………………… 39

4.4. Оператор while………………………………………….. 43

4.5. Оператор do-while……………………………………… 45

4.6. Оператор for…………………………………………….. 45

4.7. Оператор break…………………………………………. 47

4.8. Оператор continue……………………………………… 48

4.9. Оператор return…………………………………………. 49

4.10. Задания…………………………………………………. 50

Глава 5. Классы и объекты………………………… 50

5.1. Классы……………………………………………………. 50

5.2. Поля………………………………………………………. 51

5.3. Объявление методов………………………………….. 53

5.4. Конструкторы……………………………………………. 56

5.5. Передача параметров…………………………………. 58

5.6. Сборка мусора………………………………………….. 61

5.7. Ключевое слово this…………………………………… 61

5.8. Ключевое слово static………………………………… 63

5.9. Ключевое слово final………………………………….. 64

5.10. Инициализация полей……………………………….. 66

5.11. Задания…………………………………………………. 68

Глава 6. Аннотации…………………………………….. 69

6.1. Объявление аннотаций……………………………….. 69

6.2. Предопределенные аннотации………………………. 72

6.3. Мета-аннотации………………………………………… 73

6.4. Задания…………………………………………………… 75

Глава 7. Вложенные классы
и лямбда-выражения………………………………….. 75

7.1. Что такое вложенные классы……………………….. 75

7.2. Для чего использовать вложенные классы………. 76

7.3. Статические вложенные классы……………………. 77

7.4. Внутренние классы……………………………………. 79

7.5. Внутренний класс, являющийся нестатическим членом класса              80

7.6. Локальные классы…………………………………….. 81

7.7. Анонимные классы…………………………………….. 82

7.8. Затенение переменных……………………………….. 84

7.9. Лямбда-выражения…………………………………….. 85

7.10. Ссылки на методы……………………………………. 89

7.11. Когда использовать вложенные классы, локальные классы, анонимные классы
и лямбда-выражения……………………………………… 91

7.12. Задания…………………………………………………. 92

Глава 8. Интерфейсы…………………………………. 93

8.1. Теория……………………………………………………. 93

8.2. Задания…………………………………………………… 99

Глава 9. Наследование……………………………….. 99

9.1. Введение…………………………………………………. 99

9.2. Приведение типов……………………………………. 101

9.3. Переопределение (overriding) и скрытие (hiding) методов       102

9.4. Использование ключевого слова super………….. 106

9.5. Общий предок Object и его методы……………….. 109

9.6. Ключевое слово final и неизменяемые классы…. 112

9.7. Абстрактные методы и классы…………………….. 112

9.8. Задания…………………………………………………. 113

Глава 10. Пакеты……………………………………… 114

10.1. Теория…………………………………………………. 114

10.2. Задания……………………………………………….. 118

Глава 11. Перечисления……………………………. 118

11.1. Теория…………………………………………………. 118

11.2. Задания……………………………………………….. 123

Глава 12. Записи………………………………………. 123

12.1. Теория…………………………………………………. 123

12.2. Задания……………………………………………….. 125

Глава 13. Числа………………………………………… 126

13.1. Введение……………………………………………… 126

13.2. BigInteger……………………………………………… 128

13.3. BigDecimal……………………………………………. 130

13.4. Math……………………………………………………. 132

13.5. Задания……………………………………………….. 133

Глава 14. Строки………………………………………. 134

14.1. Класс String…………………………………………… 134

14.2. Методы класса String………………………………. 140

14.3. StringBuilder и StringBuffer…………………………. 143

14.4. Задания……………………………………………….. 145

Глава 15. Автоупаковка и распаковка……….. 146

15.1. Теория…………………………………………………. 146

15.2. Задания……………………………………………….. 148

Глава 16. Optional…………………………………….. 149

16.1. Теория…………………………………………………. 149

16.2. Задания……………………………………………….. 154

Глава 17. Модули……………………………………… 154

17.1. Теория…………………………………………………. 154

17.2. Задания……………………………………………….. 159

Глава 18. Обобщения………………………………… 160

18.1. Введение……………………………………………… 160

18.2. Класс Lair……………………………………………… 160

18.3. Обобщенная версия класса Lair…………………. 161

18.4. Соглашение об именовании переменных типа.. 162

18.5. Создание экземпляра обобщенного типа и обращение к нему              162

18.6. Бриллиантовая операция (Diamond operator)…. 163

18.7. Несколько параметров типа………………………. 164

18.8. Сырой тип (Raw type)……………………………… 164

18.9. Сообщения об ошибках “unchecked”……………. 165

18.10. Обобщенные методы……………………………… 166

18.11. Ограниченные параметры типа…………………. 167

18.12. Обобщения, наследование и дочерние типы… 169

18.13. Выведение типов………………………………….. 171

18.14. Выведение типов и обобщенные методы…….. 172

18.15. Выведение типов и создание экземпляра обобщенного класса           173

18.16. Выведение типа и обобщенные конструкторы обобщенных и необобщенных классов          174

18.17. Целевые типы……………………………………… 175

18.18. Подстановочный символ (wildcard)……………. 176

18.19. Подстановочный символ, ограниченный сверху (Upper bounded wildcard)           176

18.20. Неограниченный подстановочный символ (Unbounded wildcard)         177

18.21. Подстановочные символы и дочерние типы… 179

18.22. Захват символа подстановки (Wildcard Capture) и вспомогательные методы       180

18.23. Руководство по использованию подстановочного символа 182

18.24. Стирание типа (Type Erasure)…………………… 184

18.25. Стирание типа в обобщенных типах…………… 184

18.26. Стирание типа в обобщенных методах……….. 185

18.27. Получение аргумента типа родительского класса 185

18.28. Влияние стирания типа и методы-мосты
(bridge methods)………………………………………….. 186

18.29. Методы-мосты (Bridge Methods)……………….. 187

18.30. Загрязнение кучи (Heap pollution)………………. 188

18.31. Подавление предупреждений для методов с произвольным количеством параметров с нематериализуемыми формальными
параметрами………………………………………………. 191

18.32. Ограничения обобщений…………………………. 192

18.33. Задания………………………………………………. 195

Глава 26. Коллекции…………………………………. 278

26.1. Введение……………………………………………… 278

26.2. Интерфейс Collection………………………………. 278

26.3. Интерфейс Set………………………………………. 280

26.4. Интерфейс List………………………………………. 281

26.5. Интерфейс Queue…………………………………… 283

26.6. Интерфейс Deque…………………………………… 284

26.7. Интерфейс Map……………………………………… 285

26.8. Интерфейс ConcurrentMap………………………… 286

26.9. Класс Dictionary и его наследник Hashtable…… 287

26.10. Сортировка объектов……………………………… 287

26.11. Интерфейс SortedSet……………………………… 292

26.12. Интерфейс SortedMap……………………………. 294

26.13. Другие реализации интерфейсов коллекций…. 295

26.14. Java Stream API……………………………………. 296

26.15. Алгоритмы…………………………………………… 303

26.16. Задания………………………………………………. 304

Глава 27. Дата и время……………………………… 305

27.1. Введение……………………………………………… 305

27.2. Класс Date……………………………………………. 305

27.3. Класс Calendar………………………………………. 306

27.4. Пакет java.time………………………………………. 308

27.5. Перечисление DayOfWeek……………………….. 308

27.6. Перечисление Month……………………………….. 309

27.7. Класс LocalDate……………………………………… 311

27.8. Класс LocalTime…………………………………….. 311

27.9. Класс LocalDateTime……………………………….. 311

27.10. Класс YearMonth…………………………………… 312

27.11. Класс MonthDay……………………………………. 313

27.12. Класс Year…………………………………………… 313

27.13. Классы ZoneId и ZoneOffset…………………….. 313

27.14. Класс ZonedDateTime…………………………….. 315

27.15. Класс OffsetDateTime…………………………….. 315

27.16. Класс OffsetTime………………………………….. 316

27.17. Класс Instant……………………………………….. 316

27.18. Форматирование и преобразование из строки. 317

27.19. Интерфейс TemporalAdjuster……………………. 318

27.20. Интерфейс TemporalQuery………………………. 319

27.21. Класс Duration……………………………………… 319

27.22. Перечисление ChronoUnit……………………….. 320

27.23. Класс Period………………………………………… 320

27.24. Класс Clock…………………………………………. 321

27.25. Задания………………………………………………. 321

Глава 28. Форматирование и парсинг………… 322

28.1. Введение……………………………………………… 322

28.2. Класс NumberFormat……………………………….. 323

28.3. Класс DecimalFormat………………………………. 324

28.4. Класс DateFormat…………………………………… 325

28.5. Класс DateTimeFormatter…………………………. 326

28.6. Класс SimpleDateFormat…………………………… 326

28.7. Класс PrintStream…………………………………… 328

28.8. Класс Formatter……………………………………… 328

28.9. Класс Scanner……………………………………….. 333

28.10. Задания………………………………………………. 335

Глава 29. Работа с консолью…………………….. 336

29.1. Теория…………………………………………………. 336

29.2. Задание……………………………………………….. 338

Глава 30. Локализация……………………………… 339

30.1. Теория…………………………………………………. 339

30.2. Задание……………………………………………….. 341

Глава 31. Пример сервиса со Spring………….. 342

31.1. Что за сервис мы напишем……………………….. 342

31.2. Spring Initializr………………………………………… 343

31.3. Разбор сгенерированного скелета приложения.. 346

31.4. Добавление конечных точек………………………. 349

31.5. Слой бизнес-сервисов……………………………… 351

31.6. Работа с базой данных…………………………….. 357

31.7. Вызов методов с Postman………………………… 360

31.8. Docker…………………………………………………. 360

31.9. Kubernetes……………………………………………. 363

31.10. Задания………………………………………………. 366

Глава 32. Заключение……………………………….. 367