
Расстояние от острова Ява до острова Котлин составляет 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 доказали ценность обучения через рефакторинг и привели к написанию этой книги.
-
От Java к Kotlin
1500 ₽
1275 ₽