Immutability
Principle where data or objects cannot be changed after creation. Promotes predictability, concurrency safety, and testability.
Classification
- ComplexityMedium
- Impact areaTechnical
- Decision typeArchitectural
- Organizational maturityIntermediate
Technical context
Principles & goals
Use cases & scenarios
Compromises
- Performance issues due to frequent copies
- False trust in immutability when interacting with external systems
- Lack of compatibility with existing APIs
- Use immutable data types for value objects
- Combine immutability with copy-on-write and structural sharing
- Continuously measure memory and latency impact
I/O & resources
- Existing system state and data models
- Requirements for consistency, audit and compliance
- Tooling for versioning and persistence
- Immutable objects and event logs
- Improved test cases and reproduction mechanisms
- Clarified API contracts for state and versions
Description
Immutability denotes data or objects whose state cannot be changed after creation. The concept reduces side effects, simplifies reasoning, aids concurrency and enables more deterministic systems. It is applied in functional paradigms, distributed systems, versioning strategies and improves testability and fault diagnosis.
✔Benefits
- Reduced side effects
- Easier concurrency and thread-safety
- Improved reproducibility and testability
✖Limitations
- Increased memory and copy overhead
- Not all libraries/languages support immutability natively
- Complexity with large, mutable objects
Trade-offs
Metrics
- Count of unexpected side effects
Measure of side-effect related defects before and after adopting immutability.
- Average memory per request
Compare memory footprint with and without immutable data handling.
- Reproducible failure rate
Share of failures that are deterministically reproducible after concept adoption.
Examples & implementations
Immutable value objects in Java
Use final fields, no setters, defensive copies for collections.
Event sourcing with immutable events
Events are persisted append-only; state is reconstructed from events.
Immutable infrastructure images
Bake process produces versioned images that are not modified in runtime.
Implementation steps
Inventory mutable locations and prioritize by risk.
Design immutable data types and migration tests.
Gradual rollout, monitoring and performance optimization.
⚠️ Technical debt & bottlenecks
Technical debt
- Legacy APIs requiring mutable contracts
- Missing infrastructure for efficient storage of historical versions
- Insufficient tests for migration paths to immutability
Known bottlenecks
Misuse examples
- Versioning all data unnecessarily causing storage explosion
- Forcing immutability while performance-critical hot paths are affected
- Immutable objects without proper equality/hash implementations
Typical traps
- Assuming 'const' in a language implies true immutability
- Missing defensive copies for external inputs
- Underestimating memory and performance costs
Required skills
Architectural drivers
Constraints
- • Limited native support in some runtimes
- • Existing systems with mutable contracts
- • Costs for additional storage and persistence