Рубрики
Без рубрики

Серия ООП: Инкапсуляция На языке Java

Введение Инкапсуляция является одним из четырех основных принципов объектно-ориентированного программирования… С тегами java, ооп, инкапсуляция, новички.

Вступление

Инкапсуляция – это один из четырех основных принципов объектно-ориентированного программирования (ООП). Это также известно как сокрытие информации. Инкапсуляция относится к упаковке или объединению данных вместе с методами, которые манипулируют этими данными, тем самым ограничивая прямой внешний доступ к данным. Эти данные обычно представлены в виде переменных с частным доступом, объявленных внутри класса, и установщиков и getters метод, который можно использовать для обновления и извлечения значений переменных.

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

Содержание

  1. Базовые Знания
  2. Преимущества использования инкапсуляции
  3. Класс учетной записи
  4. Класс AccountTest
  5. Вывод

Ожидания

К концу этой статьи вы узнаете:

  • Обладайте глубокими знаниями о том, что такое инкапсуляция.
  • Знайте некоторые преимущества использования инкапсуляции.
  • Пишите простые Java-приложения, которые применяют концепцию инкапсуляции.

Базовые Знания

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

  • Объекты
  • Классы и методы
  • Наследование

Пожалуйста, ознакомьтесь со статьей о наследовании в Java.

Преимущества использования инкапсуляции

  • Скрытие данных: Использование модификаторов частного доступа в объявлении полей защищает это поле в классе от внешнего источника. Поэтому их можно использовать для хранения важной информации, не опасаясь утечки информации.
  • Управление: Использование методов setters и getters для доступа к закрытым полям в классе дает больший контроль над этой переменной. Предположим, что метод setBalance в классе Account обрабатывает только положительные значения и устанавливает отрицательные значения равными нулю, и пользователь хочет установить баланс счета на отрицательное значение, из-за проверки, выполненной в этом методе, ноль будет сохранен в балансе вместо отрицательного значения.
  • Уменьшает количество исключений: Предположим, пользователь вводит свой возраст в поле имени, предполагается, что программа выдаст исключение, потому что ожидается значение String , но найдено значение int . С помощью инкапсуляции этого можно избежать, проверив входные данные с помощью простого if-else оператора регулярного выражения и обработав исключение, если оно произойдет, вместо завершения программы из-за исключений.

Класс Учетной записи

Класс учетной записи отображает банковский счет, содержащий информацию, относящуюся к учетной записи. Этот класс используется для демонстрации того, как работает инкапсуляция, а также ее преимуществ.

package Encapsulation;

public class Account {

    private String firstName, lastName;
    private double balance;   

    // set and get methods

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setBalance(int balance) {
        // handles invalid balance
        if (balance >= 0.0)
            this.balance = balance;
        else 
            this.balance = 0.0;
    }

    public double getBalance() {
        return balance;
    }

    @Override
    public String toString() {
        return String.format("%s%n%s: %s%n%s: %s%n%s: %.2f%n", 
                "Account Info", "First Name", getFirstName(),
                "Last Name", getLastName(), "Balance", getBalance());
    }

}

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

    private String firstName, lastName;
    private double balance; 

В этом случае даже объекты класса не могут получить доступ к этим закрытым полям, потому что они инкапсулированы . Доступ к ним возможен только через общедоступные методы get и set, объявленные внутри класса. В более надежной системе методы set обычно имеют сложные проверки, которые должны пройти внешние значения перед их установкой, но ради этой статьи и простоты мы будем использовать оператор if-else для проверки баланса, введенного пользователем. Метод setBalance сначала проверяет, является ли баланс положительным числом (поскольку в большинстве случаев отрицательного баланса нет), аналогично методу пополнения счета. Но метод депозита добавляет сумму депозита к предыдущему балансу только в том случае, если он действителен (сумма депозита в основном имеет положительное значение).

public void setBalance(int balance) {
        // handles invalid balance
        if (balance >= 0.0)
            this.balance = balance;
        else 
            this.balance = 0.0;
    }

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

  @Override
    public String toString() {
        return String.format("%s%n%s: %s%n%s: %s%n%s: %,.2f%n", 
                "Account Info", "First Name", getFirstName(),
                "Last Name", getLastName(), "Balance", getBalance());
    }

Этот метод переопределяет встроенный по умолчанию метод toString , унаследованный от класса Object , и добавляет к нему реализацию. Преимущества этого будут рассмотрены позже в этой статье.

Класс AccountTest

Тестовый класс Account содержит объект класса Account и используется для тестирования функциональных возможностей класса Account.

package Encapsulation;

public class AccountTest {    
    public static void main(String[] args) {
        Account clerk = new Account();
        clerk.setFirstName("Clark");
        clerk.setLastName("Tom");
        clerk.setBalance(-200);

        // Before depositing
        System.out.println(clerk);

        // After depositing invalid amount
        clerk.deposit(-400);
        System.out.printf("AFter depositing invalid amount %nBalance: %,.2f%n",
                clerk.getBalance());

        // After depositing valid amount
        clerk.deposit(1500);
        System.out.printf("AFter depositing valid amount %nBalance: %,.2f%n",
                clerk.getBalance());
    }
} 

Основной метод класса AccountTest начинается с создания объекта класса Account, а затем с использованием методов set для инициализации значений объекта. На изображении ниже показаны все свойства класса Account. Как видно из приведенного ниже изображения, имя, фамилия и баланс учетной записи не видны пользователю, поскольку они объявлены закрытыми. Доступ к ним возможен только через методы get, объявленные общедоступными.

После установки имени объект пытается установить отрицательную сумму в качестве баланса счета

clerk.setBalance(-200);

но напомним, что класс счета автоматически устанавливает отрицательную полученную сумму в 0.0 в балансе счета. Здесь видна работа инкапсуляции, потому что мы успешно добавили некоторую реализацию к методу setBalance , который не виден пользователям. Кроме того, объект clerk отображается на консоли только с использованием его объектной переменной.

System.out.println(clerk);

Обратите внимание, что мы не вызывали никакого метода, который помог бы нам правильно отобразить объект но это только переменная, это потому, что реализация для нее уже обработана в переопределенном методе toString в классе Account. Пользователю не нужно испытывать стресс, пытаясь отформатировать выходные данные, потому что они уже обработаны. Следующая инструкция пытается внести отрицательную сумму на счет пользователя и выводит новый баланс.

clerk.deposit(-400);

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

clerk.deposit(1500);

На изображении ниже показан результат выполнения класса AccountTest, хранящегося в AccountTest.java . Он состоит из начального состояния учетной записи, когда пользователь пытается установить недопустимый баланс, а затем, когда пользователь пытается внести недопустимую сумму. А затем, когда пользователь вводит действительную сумму.

Вывод

Эта статья начинается с введения концепции инкапсуляции с использованием капсулы с лекарством в качестве примера, другим примером, который может быть использован здесь, является экземпляр автомобиля. У автомобиля есть, по крайней мере, тормоз и акселератор, водитель использует их для управления скоростью автомобиля, но понятия не имеет, как это делает автомобиль. Их функциональные возможности скрыты от водителя, потому что большую часть времени водителю не нужно знать, как эти вещи работают, прежде чем использовать автомобиль. Это еще один хороший пример инкапсуляции. Мы перечислили несколько преимуществ инкапсуляции, есть много других преимуществ, но мы выбрали только несколько важных из них ради этой статьи. Затем мы переходим к использованию класса account, чтобы правильно объяснить концепцию, используя некоторые примеры кода. Инкапсуляция – это широкое понятие в программировании, и реализация немного отличается в разных языках программирования, которые ее поддерживают. В этой статье продемонстрирована базовая реализация инкапсуляции с использованием Java.

Оригинал: “https://dev.to/princeibs/oop-series-encapsulation-in-java-1n51”