У нас есть статья по ООП, эта же статья является более детальной частью про инкапсуляцию. Разберём что это, её особенности и применения.
Что такое инкапсуляция?
Инкапсуляция - это один из фундаментальных принципов объектно-ориентированного программирования, который позволяет объединить данные и методы их обработки в единый компонент (класс), скрыв детали реализации от пользователя.
Представьте, что вы купили набор мебели, в котором все предметы (стол, стулья, шкаф) упакованы в отдельные коробки и снабжены инструкцией по сборке. Вы не можете увидеть, как всё устроено внутри коробки, но следуя инструкции, вы можете собрать мебель.
Инкапсуляция в программировании похожа на этот процесс. Это механизм, который объединяет данные и методы, работающие с ними, в единый объект. Другими словами, это как если бы каждый предмет мебели был «чёрным ящиком» с инструкцией, и никто не может заглянуть внутрь, чтобы понять, как он устроен, но может следовать инструкции, чтобы использовать его.
Например, вы используете пульт дистанционного управления телевизором. Вы нажимаете кнопку, и телевизор реагирует определённым образом. Вы не знаете, как именно устроена эта реакция внутри телевизора, но можете пользоваться пультом, чтобы управлять им. Это и есть инкапсуляция — вы взаимодействуете с объектом (пультом), не зная всех деталей его внутреннего устройства.
Основные механизмы
Модификаторы доступа:
- private - доступен только внутри класса
- default (без модификатора) - доступен в пределах пакета (в пределах одной папки)
- protected - доступен в пределах пакета и подклассов (те классы которые унаследованы)
- public - доступен везде (в подклассах, то есть можно наследоваться, в других папках)
Геттеры и сеттеры:
- Методы для получения и изменения значений полей
- Позволяют контролировать доступ к данным
📗Public
Первый и основной модификатор доступа, с которым сталкивается каждый программист. Для того чтобы сообщить компилятору о необходимости сделать что-либо доступным для всех, применяется ключевое слово public.
После создания экземпляра этого класса можно получить доступ к любым его свойствам из любого места программы, где доступен сам объект (включая локальные и глобальные переменные).
Это удобно, так как позволяет в любой момент выполнять операции с объектом и его данными. Однако это также создаёт уязвимость: объект становится открытым для любых манипуляций. Например, можно просто изменить его стоимость.
Как мы видим данные доступны в другом классе.
Это может привести к проблемам:
1. Сложно отследить ошибки, так как не всегда понятно, где именно они возникают.
2. Если в программу попадёт чужой код, он сможет изменять и читать свойства любых объектов.
Конечно, это не лучший сценарий для приложения.
📗Protected
Переменная или метод, объявленный как protected, доступен в том же пакете и в подклассах, даже если они находятся в других пакетах.
Когда использовать protected?
✅ Наследование — если нужно, чтобы подклассы могли использовать поля/методы, но они не должны быть публичными.
✅ Инкапсуляция в пакетах — если логика должна быть доступна только внутри пакета и наследникам.
❌ Не для публичного API — если элемент должен быть доступен всем, используйте public.
❌ Не для строгой инкапсуляции — если элемент не должен быть доступен даже наследникам, используйте private.
Ограничения protected
🚫 Нельзя получить доступ из несвязанного класса (не наследника и не из того же пакета).
🚫 Нельзя использовать для классов (только для полей, методов и конструкторов).
📗Default
Модификатор доступа default (также называемый package-private) — это уровень доступа, который применяется, когда не указан ни один из модификаторов (public, protected, private).
Ключевые особенности:
- Видимость только внутри пакета — элементы с default доступом видны только классам из того же пакета.
- Недоступен вне пакета — даже если класс наследуется, default члены не будут видны в подклассах из других пакетов.
- Применяется к классам, полям, методам и конструкторам.
Когда использовать default доступ?
✅ Логическая группировка классов — если несколько классов работают вместе внутри одного пакета, но не должны быть доступны извне.
✅ Сокрытие внутренней реализации — например, вспомогательные методы, которые не нужны другим пакетам.
❌ Не для публичного API — если функционал должен быть доступен другим пакетам, используйте public или protected.
📗Private
private — это самый строгий уровень инкапсуляции в Java. Он ограничивает видимость полей, методов и конструкторов только классом, в котором они объявлены.
Основные правила
- private-элементы не видны в подклассах, других классах того же пакета или внешних пакетах.
- Даже если класс наследуется, private поля/методы не передаются подклассам.
- Применяется к полям класса, методам, конструкторам, вложенным классам.
Нельзя использовать для классов (кроме вложенных).
Что нельзя делать с private?
❌ Обращаться из подкласса
❌ Доступ из другого класса того же пакета
📗Статические методы vs Нестатические методы
- Статические методы (с модификатором static) принадлежат классу, а не объекту. Их можно вызывать без создания объекта, например, ClassName.methodName().
- Нестатические методы принадлежат объекту. Чтобы их вызвать, нужно сначала создать объект класса.
Это важная особенность ,важно помнить о ней, так как можно не создавать объект и использовать метод или переменную напрямую.
📗Модификатор final в Java
Ключевое слово final применяется для ограничения изменений в коде. В зависимости от контекста оно может использоваться с:
- Переменными → запрещает изменение значения после инициализации.
- Методами → запрещает переопределение в подклассах.
- Классами → запрещает наследование.
Особенности:
- Примитивы: значение нельзя изменить.
- Объекты: ссылку нельзя изменить, но состояние объекта — можно.
Когда использовать final?
✅ Константы: static final для значений, которые не должны меняться.
✅ Аргументы методов: если нужно защитить параметры от изменения.
✅ Классы и методы: для запрета расширения/переопределения.
✅ Поля: для immutable-объектов (например, String).
Разница между static и final:
Если есть желание поддержать меня - донат.
Если у вас есть вопросы или вы просто хотите стать частью команды тестировщиков, то переходи в ТГ канал, где можем пообщаться с единомышленниками и найти много интересных и полезных знаний!Также если вам нужна индивидуальная консультация, менторство и помощь в создании проекта пишите в ТГ канал!