Почему Kotlin Synthetics Deprecated?#kotlin
Несколько месяцев назад Android Kotlin Extensions Gradle плагин был помечен depricated. Он давал нам две классных фичи:
•
Synthetics — плагин, который позволяет заменить findViewById;
•
Parcelize — плагин, который позволяет создавать Parcelable при помощи одной аннотации, без использования boilerplate.
Parcelize никуда не уходит, а только перемещается в отдельный плагин kotlin-parcelize, а вот Synthetics уходит навсегда. Давайте посмотрим предпосылки, почему это произошло.
Но прежде рассмотрим все существующие подходы для поиска View.
1️⃣
findViewById — функция, которая проходит по иерархии View и находит по идентификатору ту, которая необходима.
Имеет ряд существенных недостатоков:
➖
метод поиска дорогой и разработчики часто используют этот метод повторно не задумываясь о последствиях производительности;
➖
метод не null safe, то есть если в дереве не найдётся View с переданным идентификатором, то будет
NullPointerException
;
➖
нет кастования до требуемой View до Android API 26;
➖
много boilerplate кода, особенно когда в классе много View.
Есть библиотека Butter Knife, которая заметно уменьшала количество кода, однако и сократила скорость сборки приложения, к тому же не решала ряд проблем. Сейчас она также depricated.
2️⃣
Kotlin Synthetics — по сути вызывал описанный выше метод единожды и кэшировал полученные значения.
Из плюсов:
➕
нет boilerplate кода, ведь всё что требуется — это настроить плагин в Gradle и использовать идентификаторы прямо из xml-файла;
➕
type safety, то есть вам не надо делать никаких кастов.
Но давайте пройдёмся по недостаткам:
➖
частично null safe. К счастью, если вы удалите какую-то view из xml, то в коде также будет подсветка удалённой View. Однако, если вы используете несколько конфигурационных файлов, то есть шанс нарваться на
NullPointerException
.
➖
загрязнение namespaces. Если вы имеете несколько одинаковых идентификаторов в разных xml-файлах, то есть риск импортировать неверный файл и также получить
NullPointerException
.
➖
работает только в Kotlin. Может быть не критичным для тех проектов, который написаны на Kotlin, но критично для тех, у кого есть Java.
Именно из-за описанных недостатков он и был помечен depricated.
Давайте обратимся к альтернативе. ⤵️
3️⃣
View Binding — в целом, урощённая версия Data Binding, который по сути «биндится» только для ссылок на View, не связываясь с данными.
Плюсы:
➕
нет boilerplate кода;
➕
полностью null safe;
➕
type safety;
➕
нет влияния на build time в отличии от Data Binding;
➕
поддерживается как в Java, так и в KotlinОтмечу один минус:
чуть больше строк кода в сравнении с Kotlin Synthetics, ведь необходимо создать экземпляр переменной binding, которую придётся использовать потом повсюду.
Хотя я и сам очень любил Kotlin Synthetics, и мирился с его недостатками, но теперь придётся переезжать на View Binding. 🤔
Ссылка на документацию по инструменту
тут.