# Immutability

Record: `arch:immutability`
Kind: principle
Layer: [Computation Core](https://banes-lab.com/records/layer/computation-core.md)
Severity: recommended
Scope: data, value object, concurrency
Canonical: https://banes-lab.com/ontology#arch-immutability

## Repair

- Refactored by: Make Immutable, Copy-on-Write
- Detected by: setters on value objects, mutable public fields
- Violated by: mutating value objects, exposed mutable collections
- Measured by: mutable state count
- Enforced by: type system, lint rules

## requires

- [Value Semantics](https://banes-lab.com/records/lex/value-semantics.md)

## reinforces

- [Thread Safety](https://banes-lab.com/records/lex/thread-safety.md)
- [Predictability](https://banes-lab.com/records/arch/predictability.md)

## enables

- [Safe Sharing](https://banes-lab.com/records/lex/safe-sharing.md)

## conflicts-with

- [Shared Mutable State](https://banes-lab.com/records/arch/shared-mutable-state.md)

## tensions-with

- [Allocation Cost](https://banes-lab.com/records/lex/allocation-cost.md)

## tensions

- [Immutability Allocation Cost](https://banes-lab.com/records/tension/allocation-cost-immutability.md)

## referenced-by

- [Referential Transparency](https://banes-lab.com/records/arch/referential-transparency.md)
- [Value Object](https://banes-lab.com/records/arch/value-object.md)
