Ответ
Stable-аннотация (@Stable) в Jetpack Compose используется для оптимизации рекомпозиций. Она указывает, что значение или тип стабильны — их equals всегда возвращает одинаковый результат для одних и тех же входных данных. Это позволяет Compose пропускать рекомпозиции, если входные данные не изменились.
Пример:
@Stable
data class User(val name: String, val age: Int)
@Composable
fun UserProfile(user: User) {
Text(text = "${user.name}, ${user.age}") // Рекомпозиция пропускается, если user не изменился
}
Без @Stable Compose считает тип нестабильным и может выполнять лишние рекомпозиции. Аннотация особенно полезна для сложных типов или интерфейсов.
Ответ 18+ 🔞
Э, слушай, смотри, сейчас объясню про эту вашу @Stable в Compose, а то народ путается, как слепой кот в подвале.
Представь себе, что твой композебльный движок — это такой дотошный бухгалтер, ёпта. Каждый раз, когда что-то должно перерисоваться (это и есть рекомпозиция), он берет все входные данные и начинает их сравнивать: «А изменилось ли что? А точно? А может, всё-таки нет?». И если он не уверен, он пересчитывает всё нахуй, чтобы уж наверняка. Терпения ноль ебать у этого процесса.
Вот тут-то и появляется наша спасительница — аннотация @Stable. Это как ты берёшь этого бухгалтера за плечи, смотришь ему в глаза и говоришь: «Чувак, расслабься. Вот этот тип данных — стабильный, как швейцарские часы. Если name и age одинаковые, то это один и тот же User, железобетонно. Можешь не париться».
@Stable
data class User(val name: String, val age: Int)
@Composable
fun UserProfile(user: User) {
Text(text = "${user.name}, ${user.age}") // Рекомпозиция пропускается, если user не изменился
}
Видишь? Мы пометили класс User как @Stable. Теперь, когда родительская функция будет вызывать UserProfile с одним и тем же юзером, движок посмотрит, проверит, увидит аннотацию и скажет: «А, да тут нихуя не поменялось, можно и не перерисовывать». Оптимизация, скорость, красота.
А теперь представь, что мы эту аннотацию не поставили. Что тогда? А тогда наш бухгалтер-движок превращается в параноика. Он видит просто class User и думает: «А вдруг у этого класса есть какое-то скрытое, ебанько, изменяемое состояние? Вдруг его equals работает через рандом? Доверия ебать ноль!». И он будет перерисовывать UserProfile каждый раз, даже если user объективно тот же самый. Лишняя работа, тормоза, нагретый аккумулятор — вот это всё.
Особенно это пиздец как важно для всяких интерфейсов или сложных классов, которые не data class. Там без @Stable Compose вообще с ума сходит, рекомпозирует всё подряд, будто у него ипотека на кону.
Короче, суть в чём: @Stable — это твоя палочка-выручалочка, когда нужно сказать системе: «Эй, дружок, на этот тип можно положиться, он ведёт себя предсказуемо». Это не волшебная таблетка, но часто она снимает тонну лишних вычислений. Просто не забывай её ставить там, где это реально правда, а то обманешь систему — будет тебе и хиросима, и нагасаки в одном флаконе.