TL;DR: Use immutable collections to prevent unintended side effects.
Problems
Unpredictable behavior
Debugging challenges
Data corruption
Violation of the Principle of Least Astonishment
Premature optimization
Unexpected Mutations
Concurrency problems
Compromised thread safety
Increased coupling
Solutions
Use immutable collections
Create immutable classes
Copy the collection before modification
Avoid collection getters
Avoid automatic properties
Favor information hiding and encapsulation
Context
Aliasing happens when two or more variables refer to the same object.
This can lead to unexpected side effects, especially when one variable modifies the shared object.
You can't change immutable collections after creation helping you prevent accidental aliasing.
Premature optimizators will argue that copying collections is an expensive operation that you should avoid.
This is a special case of Object Aliasing
Sample Code
Wrong
public class MutableExample {
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3);
List<Integer> otherNumbers = numbers; // Aliasing
otherNumbers.add(4);
System.out.println(numbers); // Output: [1, 2, 3, 4]
}
}
Right
public class ImmutableExample {
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3);
List<Integer> otherNumbers = List.copyOf(numbers); // Creating a copy
otherNumbers.add(4);
System.out.println(numbers); // Output: [1, 2, 3]
}
}
Detection
[X] Semi-Automatic
Several static analysis tools can warn you of aliasing abuse.
Tags
Immutability
Level
[x] Intermediate
AI Generation
AI code generators might not always create immutable objects by default, especially when working with mutable collections.
You can prompt them to prioritize immutable collections and wrap existing ones to avoid aliasing.
AI Detection
AI tools can analyze code for potential aliasing issues and suggest using immutable collections instead.
Conclusion
You can avoid unintended side effects using immutable collections.
This will make your code more predictable and easier to reason about.
Relations
Code Smell 86 - Mutable Const Arrays
Code Smell 127 - Mutable Constants
Code Smell 256 - Mutable Getters
Code Smell 109 - Automatic Properties
More Info
Nude Models - Part II: Getters
Coupling - The one and only software design problem
Disclaimer
Code Smells are my opinion.
Credits
Photo by Martino Pietropoli on Unsplash
If an object is immutable, it can be in only one state, and you win big..
Joshua Bloch
Software Engineering Great Quotes
This article is part of the CodeSmell Series.