← Назад к вопросам

Что такое Stable-аннотация?

2.0 Middle🔥 61 комментариев
#Kotlin основы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

@Stable аннотация — инструмент оптимизации Compose

Это аннотация в Jetpack Compose, которая сообщает компилятору, что класс или интерфейс имеет стабильные (неизменяемые) свойства. Она помогает Compose избежать ненужных перекомпиляций при изменении состояния.

Что такое «стабильность»?

В контексте Compose, класс считается стабильным, если:

  • Все его public свойства имеют стабильные типы
  • Он помечен @Immutable или @Stable
  • Его значение не меняется неожиданно между перекомпиляциями

Классы, которые Compose считает стабильными по умолчанию:

  • String, Int, Boolean, Float и другие примитивы
  • Стабильные коллекции (List, Set из Kotlin 1.8+)
  • Пользовательские классы с @Immutable

@Stable vs @Immutable

// ❌ Нестабильный класс — Compose перерисует часто
class User {
    var name: String = "" // mutable — проблема!
    var age: Int = 0
}

// ✅ Стабильный через @Stable
@Stable
class User(
    val name: String,
    val age: Int
) // Данные не меняются внутри класса

// ✅ Более строгий @Immutable
@Immutable
data class User(
    val name: String,
    val age: Int
) // Полная неизменяемость

Зачем нужна @Stable?

Оптимизация перекомпиляции: Когда Compose видит стабильный тип в параметрах функции-композиции, он может пропустить перерисовку, если значение не изменилось:

@Composable
fun UserCard(user: User) { // User — стабильный класс
    Text(user.name)
    Text("Age: ${user.age}")
}

// Compose скипнёт перерисовку, если user остался тем же объектом
val user = User("Alice", 30)
UserCard(user = user) // Если user не изменится, перерисовка не произойдет

Без @Stable:

class User { // Нестабильный
    var name: String = ""
}

// Compose будет перерисовывать при каждом изменении родителя
// даже если User не изменился

Правила использования

Когда использовать @Stable:

  • Класс содержит данные (data class)
  • Все свойства val (read-only)
  • Не используется var внутри
  • Нет динамических ссылок на внешнее состояние
@Stable
data class Product(
    val id: String,
    val name: String,
    val price: Float
)

Когда использовать @Immutable:

  • Более строгое требование чем @Stable
  • Гарантирует 100% неизменяемость
  • Рекомендуется для критичных классов
@Immutable
data class Color(val red: Int, val green: Int, val blue: Int)

Практический пример

// BAD — нестабильный
class SearchState {
    var query: String = ""
    var results: List<String> = emptyList()
}

@Composable
fun SearchView(state: SearchState) { // Перерисует при каждом изменении родителя
    TextField(value = state.query, onValueChange = { state.query = it })
}

// GOOD — стабильный
@Stable
data class SearchState(
    val query: String = "",
    val results: List<String> = emptyList()
)

@Composable
fun SearchView(state: SearchState, onQueryChange: (String) -> Unit) {
    TextField(value = state.query, onValueChange = onQueryChange)
}

Вывод

@Stable — это аннотация для оптимизации Compose. Она помогает компилятору понять, какие классы безопасны для пропуска перерисовок. Используй её для data классов с immutable свойствами, чтобы улучшить производительность UI.