JavaRush /Курсы /Java Syntax Pro /Инкапсуляция

Инкапсуляция

Java Syntax Pro
17 уровень , 0 лекция
Открыта

1. Введение

Хотим посвятить сегодняшнюю лекцию инкапсуляции. Вы уже знаете в общих чертах, что это такое.

Инкапсуляция

В чем же преимущества инкапсуляции? Их достаточно много, но я могу выделить четыре, на мой взгляд, основных:


2. Валидное внутреннее состояние

В програмах часто возникают ситуации, когда несколько классов взаимодействуют с одним и тем же объектом. В результате их совместной работы нарушается целостность данных внутри объекта – он уже не может продолжать нормально работать.

Поэтому объект должен следить за изменениями своих внутренних данных, а еще лучше — проводить их сам.

Если мы не хотим, чтобы какая-то переменная класса менялась другими классами, мы объявляем ее private, и тогда только методы её же класса смогут получить к ней доступ. Если мы хотим, чтобы значения переменных можно было только читать, но не изменять, тогда нужно добавить public getter для нужных переменных.

Например, мы хотим, чтобы все могли узнать количество элементов в нашей коллекции, но никто не мог его поменять без нашего разрешения. Тогда мы объявляем переменную private int count и метод public getCount().

Правильное использование инкапсуляции гарантирует, что ни один класс не может получить прямой доступ к внутренним данным нашего класса и, следовательно, изменить их без контроля с нашей стороны. Только через вызов методов того же класса, что и изменяемые переменные.

Лучше исходить из того, что другие программисты всегда будут использовать ваши классы самым удобным для них образом, а не самым безопасным для вас (для вашего класса). Отсюда и ошибки, и попытки заранее избавиться от них.


3. Контроль передаваемых аргументов

Иногда нужно контролировать аргументы, передаваемые в методы нашего класса. Например, наш класс описывает объект "человек" и позволяет задать дату его рождения. Мы должны проверять все передаваемые данные на их соответствие логике программы и логике нашего класса. Например, не допускать 13-й месяц, дату рождения 30 февраля и так далее.

Зачем же кому-то указывать в дате рождения 30 февраля? Во-первых, это может быть ошибка ввода данных от пользователя. Во-вторых, прежде чем программа будет работать как часы, в ней будет много ошибок. Например, возможна такая ситуация.

Программист пишет программу, которая определяет людей, у которых день рождения послезавтра. Например, сегодня 3 марта. Программа добавляет к текущему дню месяца число 2 и ищет всех, кто родился 5 марта. Вроде бы всё верно.

Вот только когда наступит 30 марта, программа не найдет никого, т.к. в календаре нет 32 марта. В программе становится гораздо меньше ошибок, когда в методы добавляют проверку переданных данных.

Помните, когда мы изучали ArrayList и разбирали его код, и там была проверка индекса в методах get и set: index больше или равен нулю и меньше длины массива. Там еще выбрасывалось исключение, если в массиве нет элемента с таким индексом. Это классический пример проверки входных данных.


4. Минимизация ошибок при изменении кода классов

Представим, что мы написали один очень полезный класс, когда участвовали в большом проекте. Он так всем понравился, что другие программисты начали использовать его в сотнях мест в своем коде.

Класс оказался настолько полезен, что вы решили его улучшить. Но если вы удалите какие-то методы этого класса, код десятков людей перестанет компилироваться. Им придется срочно все переделывать. И чем больше переделок, тем больше ошибок. Вы поломаете кучу сборок, и вас будут ненавидеть.

А когда мы меняем методы, объявленные как private, мы знаем, что нигде нет ни одного класса, который вызывал бы эти методы. Мы можем их переделать, поменять количество параметров и их типы, и зависимый код будет работать дальше. Ну или как минимум компилироваться.


5. Задаем способ взаимодействия нашего объекта со сторонними объектами

Мы можем ограничить некоторые действия, допустимые с нашим объектом. Например, мы хотим, чтобы объект можно было создать только в одном экземпляре. Даже если его создание происходит в нескольких местах проекта одновременно. И мы можем сделать это благодаря инкапсуляции.

Инкапсуляция 2

Инкапсуляция позволяет добавлять дополнительные ограничения, которые можно превратить в дополнительные преимущества. Например, класс String реализован как immutable (неизменяемый) объект. Объект класса String неизменяем с момента создания и до момента смерти. Все методы класса String (remove, substring, ...), возвращают новую строку, абсолютно не изменяя объект, у которого они были вызваны.

Инкапсуляция очень интересная штука.

Комментарии (113)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #3585174 Уровень 33
21 июля 2025
like
2 апреля 2025
Инкапсуляцию мы одобряем :)
Юрий Уровень 20
27 февраля 2025
В хирургии инкапсуляция - это вызов.
Денис Сизов Уровень 22
23 февраля 2025
23.02.2025
Lizzka Уровень 24
31 января 2025
Если честно ничего не поняла. Хотелось бы на примерах посмотреть
Yasin Akhmadov Уровень 22
15 февраля 2025
Здравствуйте, я вижу вы хорошо продвинулись с момента написания комментария. Что вы узнали к 24 уровню? Теперь же интереснее стало?
Lizzka Уровень 24
19 февраля 2025
C 21 уровня начинается Java Core, на ней будет более детальное рассмотрение ООП и больше задачек. Будет интересно и на удивление многие задачи даже проще, чем в квесте Java Syntax)
Yasin Akhmadov Уровень 22
19 февраля 2025
Благодарю)
Олег Сычев Уровень 12
2 мая 2025
Смотрю, у вас 24 уровень еще 19 февраля был, сегодня 2 мая. Почему забросили? Или здесь получили основы, а продолжили изучать Java с помощью других ресурсов? Может быть ушли уже в Spring ?)
13 Уровень 35
22 декабря 2024
"вас будут ненавидеть" .... Чем дальше в лес, тем гуще чаща ?
Anastasiia Kriukova Уровень 11
24 октября 2024
Здається ця картинка найбільш зрозуміло описує інкапсуляцію :)
RazdolbayZateynik Уровень 28 Expert
20 октября 2024
О - очень О - опытный П - программист
D0min0D Уровень 39
20 октября 2024
Вот так на собесах и буду отвечать 😂
Rustam Уровень 3 Student
17 октября 2024
нужно больше кода
Maksim Russkih Уровень 34
8 августа 2024
Chack