Неизменяемый (immutable) класс в Java — это класс, объекты которого после создания нельзя изменить.
Правила для создания неизменяемого класса:
- Класс должен быть объявлен как
final, чтобы предотвратить наследование и изменение поведения субклассами.
- Все поля должны быть объявлены как
final, чтобы их нельзя было изменить после инициализации.
- Все поля должны быть объявлены как
private, чтобы предотвратить прямой доступ извне.
- Не предоставлять setter-методы.
- Если класс содержит изменяемые поля, например,
List, их нужно копировать в конструкторе и при возвращении из getter-методов (defensive copy).
- Не предоставлять методы, которые могут изменить состояние объекта.
Преимущества неизменяемых классов:
- Потокобезопасность (thread-safety): несколько потоков могут безопасно обращаться к одному и тому же объекту без необходимости синхронизации.
- Кэширование: неизменяемые объекты легко кэшируются, что улучшает производительность.
- Простота отладки и тестирования: состояние объекта предсказуемо.
- Использование в качестве ключей в ассоциативных коллекциях (
Map, Set).
Пример неизменяемого класса:
java