НАЙКРАЩИЙ САЙТ ДЛЯ ВЕБ-РОЗРОБНИКІВ
Мова програмування Java. W3Schools українською. Уроки для початківців

En

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


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

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

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

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

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

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

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

Приклад

public class Person {
  private String name; // private = обмежений доступ

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

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

Пояснення прикладу

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

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

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

Приклад

public class Main {
  public static void main(String[] args) {
    Person myObj = new Person();
    myObj.name = "John";  // помилка
    System.out.println(myObj.name); // помилка
  }
}
Спробуйте самі »

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

John

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

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"); // Встановити значення назви змінної на "John"
    System.out.println(myObj.getName());
  }
}

// Виведе "John"
Спробуйте самі »

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

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