Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
@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.