Ответ
Аннотации в Compose помогают оптимизировать и контролировать поведение функций и компонентов. Основные:
@Composable – маркирует функцию как композейбл, позволяя ей участвовать в рекомпозиции.
@Preview – позволяет отображать композейбл в Android Studio без запуска приложения.
@Preview
@Composable
fun Greeting() {
Text("Hello")
}
@Stable – указывает, что тип или интерфейс неизменяем, помогая Compose избегать лишних рекомпозиций.
@Immutable – аналогично @Stable, но для полностью неизменяемых классов.
Ответ 18+ 🔞
Да ты посмотри, какие штуки придумали, ёпта! В Compose, чтобы твои компоненты не сходили с ума и не перерисовывались от каждого чиха, есть специальные аннотации. Это как метки, которые ты вешаешь на код, и система понимает: "Ага, с этим чуваком можно вот так, а этот — стабильный тип, его можно не трогать лишний раз".
Вот основные, без которых никуда:
@Composable — это, бля, святое. Без этой штуки твоя функция — просто какая-то мартышлюшка, а не компонент. Помечаешь ей функцию — и всё, она теперь может участвовать в этой всей движухе с рекомпозицией. Без неё Compose на тебя даже смотреть не будет, доверия ебать ноль.
@Preview — вот это вообще магия, ядрёна вошь! Хочешь посмотреть, как твой интерфейс будет выглядеть, но запускать целое приложение и ждать, пока эмулятор вздохнёт — лень? Нахуй это всё! Просто повесь @Preview над функцией, открой вкладку в Android Studio — и вуаля, твой компонент прямо там, живой. Чистая магия, я тебе говорю.
@Preview
@Composable
fun Greeting() {
Text("Hello")
}
Вот так вот. Написал, сохранил — и сразу видишь результат. Удобно, бля, до охуенно.
А теперь про оптимизацию, тут самое интересное начинается. Compose — он умный, но не телепат. Иногда ему надо помочь, чтобы он не устраивал рекомпозицию на ровном месте.
@Stable — это как табличка "Не трогать, всё ок". Вешаешь её на тип или интерфейс и говоришь системе: "Слушай, чувак, этот объект — надёжный парень. Его публичные поля после создания не меняются, а если и меняются, то мы тебя уведомим. Поэтому не надо пересчитывать всё подряд, если он в аргументах". Помогает отсечь кучу лишней работы.
@Immutable — это, можно сказать, старший брат @Stable. Ещё более строгий. Этой аннотацией ты заявляешь: "Ёб твою мать, этот класс вообще полностью неизменяемый! Все его поля — val, и они все примитивы или тоже неизменяемые типы. Можешь спать спокойно, тут ничего не поменяется никогда". Compose такие типы обожает и оптимизирует под них по полной программе.
Короче, суть в чём: используешь @Stable для изменяемых, но уведомляемых типов, а @Immutable — для тех, которые создал и забыл, как скалу. И тогда твой интерфейс будет летать, а не дёргаться как сумасшедший.