Menu
Coddy logo textTech

Сокрытие данных

Часть раздела Объектно-ориентированное программирование путешествия по 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;
    }
}

Теперь недопустимые значения температуры отклоняются автоматически. Внутреннее представление скрыто — вы сможете позже изменить способ внутреннего хранения температуры (возможно, в Кельвинах), не затрагивая код, использующий этот класс.

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

challenge icon

Задание

Легко

Давайте создадим класс управления 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")
        
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование