Модификатор final в Java можно применить к:
-
Переменным:
- Локальные переменные: Их значение присваивается один раз и не может быть изменено после инициализации.
- Поля класса: Значение поля присваивается либо при объявлении, либо в конструкторе и затем не может быть изменено.
- Параметры метода: Параметр внутри метода становится константой; его нельзя переприсвоить внутри тела метода.
Применение final к переменным обеспечивает:
- Иммутабельность: Гарантия, что значение не изменится.
- Потокобезопасность:
final поля класса автоматически видны всем потокам после завершения конструктора без дополнительной синхронизации.
- Оптимизации компилятора: Компилятор может производить некоторые оптимизации, зная, что значение не изменится.
-
Методам:
- Метод, объявленный как
final, не может быть переопределен в подклассах.
- Это полезно для:
- Предотвращения нежелательного изменения поведения: Гарантирует, что логика метода останется неизменной.
- Стимулирования композиции: Подталкивает к использованию композиции вместо наследования.
- Возможных оптимизаций компилятора: Компилятор может выполнять инлайн-развертывание вызовов
final методов.
-
Классам:
- Класс, объявленный как
final, не может иметь подклассов.
- Применение
final к классу используется для:
- Создания неизменяемых (иммутабельных) классов: Например, классы-обертки примитивов (Integer, String).
- Защиты дизайна: Предотвращает расширение, которое может нарушить инварианты класса.
- Повышения безопасности: Гарантирует, что поведение класса не может быть изменено путем создания подклассов.
| Применение | Описание | Преимущества |
|---|
final поле | Значение присваивается один раз (при объявке или в конструкторе). | Иммутабельность, потокобезопасность, оптимизации. |
final параметр | Значение не может быть изменено внутри метода. | Четкая сигнатура, гарантия неизменности значения параметра. |
final метод | Не может быть переопределен в подклассах. | Предотвращение изменения поведения, стимулирование композиции, оптимизации. |
final класс | Не может иметь подклассов (невозможно наследование). | Иммутабельность класса, защита дизайна, повышение безопасности. |
Примеры:
java