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
) - Гнучкий: програміст може змінити одну частину коду, не впливаючи на інші частини
- Підвищена безпека даних