---
title: "Immutable"
description: "Immutable can be used to mark class as producing immutable instances."
type: "class"
lastmod: "2026-06-04T09:07:42.914479Z"
---
## API Reference

> Source set: Common

```kotlin
@MustBeDocumented
@Target(AnnotationTarget.CLASS)
@StableMarker
public annotation class Immutable
```

[Immutable](/jetpack-compose/androidx.compose.runtime/runtime-annotation/classes/Immutable) can be used to mark class as producing immutable instances. The immutability of the
class is not validated and is a promise by the type that all publicly accessible properties and
fields will not change after the instance is constructed. This is a stronger promise than `val`
as it promises that the value will never change not only that values cannot be changed through a
setter.

[Immutable](/jetpack-compose/androidx.compose.runtime/runtime-annotation/classes/Immutable) is used by composition which enables composition optimizations that can be performed
based on the assumption that values read from the type will not change. See [StableMarker](/jetpack-compose/androidx.compose.runtime/runtime-annotation/classes/StableMarker) for
additional details.

`data` classes that only contain `val` properties that do not have custom getters can safely be
marked as [Immutable](/jetpack-compose/androidx.compose.runtime/runtime-annotation/classes/Immutable) if the types of properties are either primitive types or also [Immutable](/jetpack-compose/androidx.compose.runtime/runtime-annotation/classes/Immutable):

Marking `Person` immutable allows calls the `PersonView` [androidx.compose.runtime.Composable](/jetpack-compose/androidx.compose.runtime/runtime/classes/Composable)
function to be skipped if it is the same `person` as it was during the last composition.

## Code Examples

### simpleImmutableClass
```kotlin
fun simpleImmutableClass() {
    @Immutable data class Person(val name: String, val phoneNumber: String)
    @Composable
    fun PersonView(person: Person) {
        Column {
            Row {
                Text("Name: ")
                Text(person.name)
            }
            Row {
                Text("Phone: ")
                Text(person.phoneNumber)
            }
        }
    }
    @Composable
    fun PeopleView(people: List<Person>) {
        Column {
            for (person in people) {
                PersonView(person)
            }
        }
    }
}
```
