Enkapsulacja Javy
Kapsułkowanie
Znaczenie enkapsulacji polega na upewnieniu się, że „wrażliwe” dane są ukryte przed użytkownikami. Aby to osiągnąć, musisz:
- zadeklaruj zmienne/atrybuty klas jako
private
- udostępnij publiczne metody pobierania
i ustawiania w celu uzyskania dostępu i aktualizacji wartości
private
zmiennej
Pobierz i ustaw
Z poprzedniego rozdziału dowiedziałeś się, że do private
zmiennych można uzyskać dostęp tylko w obrębie tej samej klasy (klasa zewnętrzna nie ma do niej dostępu). Dostęp do nich jest jednak możliwy, jeśli udostępnimy publiczne metody pobierania i ustawiania .
Metoda get
zwraca wartość zmiennej, a set
metoda ustawia wartość.
Składnia obu jest taka, że zaczynają się od albo get
lub set
, po którym następuje nazwa zmiennej, z pierwszą literą wielką literą:
Przykład
public class Person {
private String name; // private = restricted access
// Getter
public String getName() {
return name;
}
// Setter
public void setName(String newName) {
this.name = newName;
}
}
Przykład wyjaśniony
Metoda get
zwraca wartość zmiennej name
.
Metoda set
pobiera parametr ( newName
) i przypisuje go do
name
zmiennej. Słowo this
kluczowe służy do odwoływania się do bieżącego obiektu.
Ponieważ jednak name
zmienna jest zadeklarowana jako private
, nie
możemy uzyskać do niej dostępu spoza tej klasy:
Przykład
public class Main {
public static void main(String[] args) {
Person myObj = new Person();
myObj.name = "John"; // error
System.out.println(myObj.name); // error
}
}
Gdyby zmienna została zadeklarowana jako public
, oczekiwalibyśmy następującego wyniku:
John
Jednak gdy próbujemy uzyskać dostęp do private
zmiennej, otrzymujemy błąd:
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
Zamiast tego używamy metod getName()
i w setName()
celu uzyskania dostępu i aktualizacji zmiennej:
Przykład
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"
Dlaczego enkapsulacja?
- Lepsza kontrola atrybutów i metod klas
- Atrybuty klas mogą być tylko do odczytu (jeśli używasz tylko
get
metody) lub tylko do zapisu (jeśli używasz tylkoset
metody) - Elastyczny: programista może zmienić jedną część kodu bez wpływu na inne części
- Zwiększone bezpieczeństwo danych