Для чего нужны аннотации в Jetpack Compose

Ответ

Аннотации в 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 — для тех, которые создал и забыл, как скалу. И тогда твой интерфейс будет летать, а не дёргаться как сумасшедший.