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

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

2.0 Middle🔥 141 комментариев
#JVM и память#Kotlin основы

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

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

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

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

@Mutable — это аннотация из пакета kotlin.jvm.internal, которая помечает типы как изменяемые (mutable). Это инструмент для работы с типом-безопасностью и явного указания о мутируемости объектов.

Назначение и использование

@Mutable используется для:

  • Явного указания на то, что объект может быть изменён
  • Документирования контрактов функций и параметров
  • Информирования разработчиков и инструментов анализа о потенциальных изменениях состояния
  • Улучшения read-only гарантий в Kotlin коде

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

// Аннотация указывает, что коллекция может быть изменена
fun processUsers(@Mutable users: MutableList<User>) {
    users.add(User("John", 30))
    users.removeAt(0)
}

// Без аннотации код менее явный
fun modifyList(list: MutableList<String>) {
    list.add("item")
}

// В контексте Android — часто с данными
class UserViewModel {
    @Mutable
    private val _users = mutableListOf<User>()
    val users: List<User> = _users
}

Связь с immutability в Kotlin

Kotlin различает:

  • val — переменная (но не объект) неизменяемая
  • var — переменная изменяемая
  • List<T> — read-only интерфейс
  • MutableList<T> — интерфейс, позволяющий изменения
val immutableRef: List<String> = mutableListOf("A", "B")
// immutableRef.add("C") — ошибка: List не имеет add()

val mutableRef: MutableList<String> = mutableListOf("X", "Y")
mutableRef.add("Z") // OK

@Mutable в контексте функциональности

// Функция явно говорит, что будет мутировать параметр
fun updateUserList(
    @Mutable users: MutableList<User>,
    newUser: User
) {
    users.add(newUser)
    users.sortBy { it.name }
}

// Вызывающий код понимает, что список изменится
val myUsers = mutableListOf(User("Alice", 25))
updateUserList(myUsers, User("Bob", 30))
// myUsers теперь содержит двух пользователей, отсортированных по имени

Почему это важно в Android

  1. Предсказуемость — читая сигнатуру функции, ясно, будет ли изменён объект
  2. Безопасность потоков — помогает выявить места, где нужна синхронизация
  3. Удобство рефакторинга — IDE может предупредить об изменении мутируемых объектов
  4. Лучшая документация — код становится более самодокументирующимся

@Mutable — это не самая распространённая аннотация, но полезна в больших проектах для явной коммуникации о мутациях состояния. Современная практика предпочитает использовать read-only типы и StateFlow/LiveData для управления изменяемым состоянием в Android.