Java Encapsulation

Оновлено: 22.05.2023

Інкапсуляція

Сенс інкапсуляції полягає в тому, щоб переконатися, що "чутливі" дані приховані від користувачів. Щоб досягти цього, ви повинні:

оголошувати змінні/атрибути класу як private надавати загальнодоступні методи get та set для доступу та оновлення значення приватної змінної

Отримати та встановити

З попереднього розділу ви дізналися, що до приватних змінних можна отримати доступ лише в межах одного класу (зовнішній клас не має до них доступу). Однак, доступ до них можливий, якщо ми надамо загальнодоступні методи get та set.

Метод get повертає значення змінної, а метод set встановлює значення.

Синтаксис обох команд полягає в тому, що вони починаються з get або set, за якими слідує ім'я змінної, з першої літери у верхньому регістрі:

public class Person {
  private String name; // private = restricted access

  // Getter
  public String getName() {
    return name;
  }

  // Setter
  public void setName(String newName) {
    this.name = newName;
  }
}

Метод get повертає значення змінної name.

Метод set отримує параметр (newName) і присвоює його змінній name. Ключове слово this використовується для посилання на поточний об'єкт.

Однак, оскільки змінна з іменем оголошена як приватна, ми не можемо отримати до неї доступ ззовні цього класу:

public class Main {
  public static void main(String[] args) {
    Person myObj = new Person();
    myObj.name = "John";  // error
    System.out.println(myObj.name); // error 
  }
}

Приклад запуску "

Якби змінна була оголошена як загальнодоступна, ми б очікували наступний вивід:

John

Однак, коли ми намагаємося отримати доступ до приватної змінної, ми отримуємо помилку:

MyClass.java:4: error: name has private access in Person
    myObj.name = "John";
         ^
MyClass.java:5: error: name has private access in Person
    System.out.println(myObj.name);
                  ^
2 errors

Замість цього ми використовуємо методи getName() і setName() для доступу до змінної та її оновлення:

public class Main {
  public static void main(String[] args) {
    Person myObj = new Person();
    myObj.setName("John"); // Set the value of the name variable to "John"
    System.out.println(myObj.getName());
  }
}

// Outputs "John"

Чому інкапсуляція?

Кращий контроль над атрибутами та методами класу Атрибути класу можна зробити доступними тільки для читання (якщо ви використовуєте тільки метод get) або тільки для запису (якщо ви використовуєте тільки метод set) Гнучкість: програміст може змінити одну частину коду, не впливаючи на інші частини Підвищена безпека даних