Using getters is a significant issue. Exposing internals is a major problem
TL;DR: Don’t expose your internals and lose control
Problems
- Mutability
- Unexpected Changes
- Ripple Effects
- Thread unsafety
- Encapsulation Principle violation
Solutions
- Return shallow copies of your collections
Context
Immutable objects are essential in functional and object-oriented programming.
Once created, their state cannot be altered.
This is key to keeping object integrity and ensuring thread safety in multithreaded applications.
Mutable getters allow callers to access and modify the internal state of an object, leading to potential corruption and unexpected behavior.
When you break encapsulation, you take responsibility away from an object. Integrity is lost.
Returning a page in a book is like an immutable copy. It cannot be edited, like a human memory.
You can edit some memories by bringing them from long-term memory.
Sample Code
Wrong
public class Person {
private List hobbies;
public Person(List hobbies) {
this.hobbies = hobbies;
}
public List getHobbies() {
return hobbies;
}
}
Right
public class Person {
private List hobbies;
public Person(List hobbies) {
this.hobbies = new ArrayList<>(hobbies);
}
public List hobbies() {
// This returns a shallow copy
// This is usually not a big performance issue
return new ArrayList<>(hobbies);
}
}
Detection
You can detect mutable getters by examining the return types of your getters.
If they return mutable collections or objects, you need to refactor them to return immutable copies or use immutable data structures.
Level
AI Generation
AI generators might create this smell if they prioritize simplicity and brevity over best practices.
They not always consider the implications of returning mutable objects.
AI Detection
AI tools can detect this smell if you instruct them to look for getters returning mutable objects or collections.
They can suggest returning copies or using immutable types to fix the issue.
Conclusion
Getters are a code smell, but something you need to return objects you hold.
You can do it at your own risk, but retain the tracking of those collections.
Avoid mutable getters to protect your object integrity and encapsulation.
By returning immutable copies or using immutable types, you can prevent unintended modifications and ensure your objects remain reliable and predictable.
Relations
Code Smell 109 – Automatic Properties
Disclaimer: Code Smells are my opinion.
The best programmers write only easy programs.
Michael A. Jackson
Software Engineering Great Quotes