🔥 🚀 Важно для всех, кто работает с Java! 🔥
На JavaRocks ты найдешь уникальные туториалы, практические задачи и редкие книги, которых не найти в свободном доступе. Присоединяйся к нашему Telegram-каналу JavaRocks — стань частью профессионального сообщества!
Всем привет! Сегодня поговорим об инкапсуляции в Java и сразу начнем с примеров 🙂
Представьте, что перед вами кофейный автомат. Знаете ли вы, откуда берется кофе? Как поддерживается внутренняя температура? Как автомат определяет, как много молока нужно добавить?
Возьмём другой пример: как работает поисковая система Google? Как происходит поиск информации, релевантной запросу? Почему именно такой порядок ссылок на страницы с результатами?
И процесс приготовления кофе автоматом, и работа поисковой системы невозможны без одного из главных принципов ООП, инкапсуляции.

Инкапсуляция в Java
Изначально “инкапсуляция” – объединение данных и методов работы с этими данными в одном пакете (“капсуле”).
В Java в роли “капсулы” выступает класс. Он содержит как данные (поля), так и методы работы с ними.
Несмотря на то, что такой расклад событий кажется очевидным, в других парадигмах программирования все устроено иначе. Например, в функциональном программировании данные строго отделены от операций над ними.
А что насчет сокрытия реализации?
Зачастую термин “инкапсуляция” используется в контексте сокрытия внутренних деталей реализации объекта. Мы же используем сложные механизмы по типу кофейного автомата и поисковой системы Google, не понимая, как они устроены. Дело в том, что их создатели предоставили простые и удобные интерфейсы для комфортного использования этих механизмов.
Для обычного пользователя не имеет значения то, как автомат выглядит изнутри. Главное – взаимодействие с кнопками на панели: одна позволяет выбрать разновидность напитка, вторая отвечает за выбор сиропа и т.д. В этом и заключается суть термина “инкапсуляции” в рассматриваемом значении: все “внутренности” программы скрыты от пользователя.
В качестве примера рассмотрим класс Vehicle
:
public class Vehicle {
public void gas() {
/* тут происходят сложные процессы, и в результате автомобиль движется вперед */
}
public void brake() {
/* тут тоже происходит магия сложных вещей, в результате автомобиль замедляется */
}
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
// Как все выглядит для пользователя
// Нажмите на одну педаль, и автомобиль тронется с места
vehicle.gas();
// Нажмите на другую педаль, и автомобиль затормозит
vehicle.brake();
}
}
Run CodeВот так Java-программе происходит сокрытие реализации. Достаточно просто вызвать нужный метод; то, что происходит “внутри”, не имеет значения.
Немного о сокрытии данных
В Java, помимо сокрытия реализации, есть также сокрытие данных.
Например, мы создали класс Cat
:
public class Cat {
public String name;
public int age;
public int weight;
public Cat(String name, int age, int weight) {
this.name = name;
this.age = age;
this.weight = weight;
}
public Cat() {
}
public void sayMeow() {
System.out.println("Meow!");
}
}
Run CodeПроблема этого класса заключается в том, что его данные (поля) открыты для всех. Другой программист может легко создать безымянную кошку с весом 0 и возрастом -1000 лет:
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "";
cat.age = -1000;
cat.weight = 0;
}
Run CodeВ такой ситуации можно пристально следить за тем, не создаст ли кто-то из коллег каких-то “странных” объектов, но гораздо лучше было бы исключить саму возможность создавать такие “неправильные” объекты.
Сокрытие данных достигается с помощью:
- модификаторов доступа(private, protected, package default);
- геттеров и сеттеров.
Использование термина “инкапсуляция” в смысле сокрытия реализации является наиболее правильным. Тем не менее, другие значения также допускаются.
Преимущества, которые предоставляет инкапсуляция:
- Контроль корректного состояния объекта: благодаря сеттеру и модификатору
private
мы обезопасили нашу программу от кошек с весом 0. - Удобный интерфейс: возможность оставить в распоряжении пользователя только методы.
- Изменения внутри кода не влияют на то, как пользователи воспринимают механизм работы.
Перевод статьи «Encapsulation in Java».
Еще два основных принципа ООП – наследование и полиморфизм, вы можете перейти по ссылкам и прочитать о них подробнее в наших статьях 🙂