Сокрытие данных
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 12 из 87.
Скрытие информации — это принцип ограничения прямого доступа к внутренним данным объекта. Сочетая поля private с геттерами и сеттерами, вы создаете защитный барьер вокруг состояния вашего объекта.
Рассмотрим, что происходит без сокрытия информации:
public class Temperature {
public double celsius; // Доступно напрямую
}
// Кто угодно может установить недопустимые значения
Temperature t = new Temperature();
t.celsius = -500; // Ниже абсолютного нуля — невозможно!С помощью сокрытия информации вы контролируете, как осуществляется доступ к данным и их изменение:
public class Temperature {
private double celsius;
public void setCelsius(double celsius) {
if (celsius >= -273.15) {
this.celsius = celsius;
}
}
public double getCelsius() {
return celsius;
}
}Теперь недопустимые значения температуры отклоняются автоматически. Внутреннее представление скрыто — вы сможете позже изменить способ внутреннего хранения температуры (возможно, в Кельвинах), не затрагивая код, использующий этот класс.
Этот подход предлагает три ключевых преимущества: валидация обеспечивает целостность данных, гибкость позволяет вносить внутренние изменения, не нарушая работу внешнего кода, и контроль позволяет вам точно определять, какие операции разрешены для ваших данных.
Задание
ЛегкоДавайте создадим класс управления Password, который демонстрирует сокрытие информации, защищая конфиденциальные данные и обеспечивая соблюдение правил безопасности через контролируемый доступ.
Вы создадите два файла для организации вашего кода:
Password.java: Создайте класс Password, который скрывает свои внутренние данные и контролирует способы установки и доступа к паролям:- Приватное поле
password(String), в котором хранится сам пароль - Приватное поле
minLength(int), определяющее минимально допустимую длину пароля - Конструктор, принимающий требование к минимальной длине
- Сеттер
setPassword(String password), который принимает только те пароли, которые соответствуют требованию минимальной длины. Если пароль валиден, сохраните его и вернитеtrue; если он слишком короткий, не меняйте пароль и вернитеfalse - Геттер
getMaskedPassword(), который возвращает пароль, где все символы заменены звездочками (*) — никогда не раскрывайте настоящий пароль! - Метод
checkPassword(String attempt), который возвращаетtrue, если попытка совпадает с сохраненным паролем, иfalseв противном случае - Геттер
getLength(), который возвращает длину текущего пароля (или 0, если пароль не установлен)
- Приватное поле
Main.java: Создайте объект Password с минимальной длиной 6, затем считайте два входных значения: пароль для установки и попытку для проверки. Выведите три строки:Set: trueилиSet: false(результат установки пароля)Masked: ******(маскированная версия пароля)Match: trueилиMatch: false(результат проверки попытки)
Вы получите два входных значения: пароль для установки и попытку ввода пароля для проверки.
Обратите внимание, что сам пароль никогда не доступен напрямую извне класса — это и есть сокрытие информации в действии. Класс точно контролирует, какая информация раскрывается и как пароль может быть изменен.
Шпаргалка
Сокрытие информации ограничивает прямой доступ к внутренним данным объекта с помощью использования полей private в сочетании с геттерами и сеттерами.
Без сокрытия информации поля открыты и могут принимать недопустимые значения:
public class Temperature {
public double celsius; // Доступно напрямую
}
Temperature t = new Temperature();
t.celsius = -500; // Допустимо некорректное значениеС сокрытием информации вы контролируете доступ и проверяете данные:
public class Temperature {
private double celsius;
public void setCelsius(double celsius) {
if (celsius >= -273.15) {
this.celsius = celsius;
}
}
public double getCelsius() {
return celsius;
}
}Основные преимущества сокрытия информации:
- Валидация: Обеспечивает целостность данных, отклоняя недопустимые значения
- Гибкость: Позволяет вносить внутренние изменения, не затрагивая внешний код
- Контроль: Позволяет вам решать, какие операции разрешены над вашими данными
Попробуйте сами
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Прочитать пароль для установки
String passwordToSet = scanner.nextLine();
// Прочитать попытку ввода пароля для проверки
String passwordAttempt = scanner.nextLine();
// TODO: Создать объект Password с минимальной длиной 6
// TODO: Установить пароль и вывести результат ("Set: true" или "Set: false")
// TODO: Вывести замаскированный пароль ("Masked: ******")
// TODO: Проверить попытку ввода пароля и вывести результат ("Match: true" или "Match: false")
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»