We Love Android

Description
Новости из мира Android-разработки
Advertising
We recommend to visit

?Телеграмдаги Энг сўнгги хит тароналар факат бизда

?? - УЗ
?? - РУ
?? - ТР
?? - Ус
?? - АЗ
?? - ТЖ
?? - КЗ
?? - КР

Creator : @kiinyaz

Last updated 1 Jahr her

Бесплатные игры и программы для Android

❗️Сотрудничество (ads), DMCA, пожелания: t.me/EasyAPKBot

💵Реклама: https://telega.in/c/EasyAPK

🔴 Чат: @ChatEasyAPK

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

Last updated 9 Monate, 3 Wochen her

Главное про технологии, интернет-культуру, тренды и нейросети.

По рекламе: @Alivian

Биржа: https://telega.in/c/technomotel

Last updated 4 Tage, 6 Stunden her

7 months, 3 weeks ago

Продолжаю рубрику #насмотренность. Сегодня смотрим на inline-классы. На мой взгляд это одна из самый недооценённых фичей Котлина. Подозреваю, что это потому что потребность в inline-классах неочевидна. Попробую это исправить.

Напомню. Inline-класс это обёртка над другим типом. Он должен иметь строго один параметр в основном конструкторе — значение которое мы оборачиваем. При компиляции вместо нашего класса будет подставлено обёрнутое значение. То есть класс есть, а лишних аллокаций нет. Красота!

Минутка духоты: На самом деле обёрнутое значение не всегда будет инлайниться. Принцип работы похож на (un)boxing примитивов. Но это тема для отдельного поста.

1️⃣ Объявление собственных примитивов

Примитивные типы это то, что должно работать быстро. Мы ожидаем, что примитивы передаются по значению, то есть для них не создаётся объект в куче. Звучит как работа для inline-класса, ведь если в него завернуть примитив, то и перформанс получим как у примитива.

За примером далеко ходить не надо — UInt и другие беззнаковые типы в Kotlin это inline-классы. Но вот где действительно разгулялись с примитивами, так это в Jetpack Compose. Цвета раньше передавались либо как Int в формате 0xAARRGGBB, либо как класс, теперь же Color это inline-class. Получаем все удобства класса и легковесность примитива. Кроме цветов есть ещё Dp, Size, Offset и т.д. (для типов, состоящих их нескольких свойств, например Size, под капотом используется упаковка данных в один примитив). Так что, если вас как и меня мучил вопрос почему нет ничего страшного в том, что мы на каждой рекомпозиции создаём объекты, это потому что на самом деле никаких объектов нет.

2️⃣ Дешевые enum'ы

Помните совет гугла заменять enum'ы на Int с аннотацией @IntDef? Потом Jake Wharton рассказал, что R8 умеет оптимизировать enum'ы и мы выдохнули.
Так вот если всё-таки нужно заменить enum на примитив, inline-классы помогут обойтись без сомнительных конструкций с @IntDef, которые опираются только на стат. анализ.

Примеры этого подхода, опять же, можно посмотреть в Compose: TextAlign , TextOverflow и LineBreak. Да, к сожалению, при таком подходе в when нет проверки, что покрыты все ветви, но на этот компромисс я готов пойти.

3️⃣ Обёртки

Наиболее частое применение inline-классов — создание обёрток над другими типами, чтобы:
? Получить более строгую типизацию. Например, чтобы не ошибиться когда у нас много ID-шников одинакового типа у разных сущностей. Или более явно указать в сигнатуре функции, что "этот параметр должен быть не какой угодно строкой, а именно номером телефона". Это работает благодаря важному свойству inline-классов, что их нельзя сравнивать с другими типами. Попытка такого сравнения выкинет ошибку на этапе компиляции.
? Сузить скоуп для утилитарных функций. Вот есть у нас номер карты пользователя в формате строки. Мы хотим делать с этим номером много всякого: форматировать группами по 4 цифры, вывести маскированный номер карты вида *1234 и т.д. Можно сделать кучу экстеншенов на String, которые будут видны когда нужно и когда не нужно, а можно завести inline-класс и явно определить что с ним можно делать.
? Добавить новые свойства обёртнутой сущности. Добавить @Immutable ко спискам? Запросто.

Напоследок пример где и типизация важна, и новые свойства добавляются. Помните как в onMeasure нам прилетают Int'ы, с которыми нужно работать исключительно через утилитарный класс MeasureSpec? В Compose вместо этого прилетает один класс Constraints и мы сразу, без похода в документацию, понимаем набор действий, который можно совершать с этим классом. Ну не красота ли?

We recommend to visit

?Телеграмдаги Энг сўнгги хит тароналар факат бизда

?? - УЗ
?? - РУ
?? - ТР
?? - Ус
?? - АЗ
?? - ТЖ
?? - КЗ
?? - КР

Creator : @kiinyaz

Last updated 1 Jahr her

Бесплатные игры и программы для Android

❗️Сотрудничество (ads), DMCA, пожелания: t.me/EasyAPKBot

💵Реклама: https://telega.in/c/EasyAPK

🔴 Чат: @ChatEasyAPK

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

Last updated 9 Monate, 3 Wochen her

Главное про технологии, интернет-культуру, тренды и нейросети.

По рекламе: @Alivian

Биржа: https://telega.in/c/technomotel

Last updated 4 Tage, 6 Stunden her