[PL] Wstęp do programowania w Javie dla kompletnych laików #10 - poznanie pojęcia enkapsulacji (hermetyzacji) klas

in polish •  7 years ago 

Cześć,

w tym poście chciałbym się skupić na pojęciu enkapsulacji. 

Co to właściwe oznacza w programowaniu?

Każda klasa powinna zachowywać się "samolubnie". To znaczy, że wszelkie informacje powinny być przekazywane jedynie przez metody. Natomiast dostęp do pól powinny mieć w większości przypadków - klasa, w której pole zostało zdefiniowane oraz klasa, która dziedziczy pewne części od klasy głównej (O dziedziczeniu napiszę trochę później). Czy udostępnianie pól bez metod pośredniczących jest błędem?

Niekoniecznie.

Wiele programów posiada klasy udostępniające bezpośredni dostęp do pewnych pól(zmiennych). Ale z drugiej strony, bez metody pośredniczących z udostępnianiem danych, nasz program może być trudniej utrzymywany. Dodatkowo, gdy będziemy chcieli zmienić coś w kodzie, to zaburzymy działanie innych klas. Dzięki używaniu metod "getterów", możemy modyfikować działanie z większą pewnością.

No dobrze, to jak tworzyć takie samolubne klasy.

Musimy sobie przypomnieć o trzech słowach kluczowych: 

  • public
  • private
  • protected

Słowo kluczowe public (w tym przypadku) mówi, że dane pole(inaczej zmienna) może zostać odczytana bezpośrednio z obiektu w następujący sposób:

JakasKlasa obiekt = new JakasKlasa();

in jakasZmienna = obiekt.jakiesPole;

Jak widzicie powyżej, jest pewien obiekt i pobieram jego wartość w polu o nazwie "jakiesPole"

Przy słowie kluczowym private, powyższy kod nie zostałby skompilowany w naszym IDE. Powód jest taki, że słowo kluczowe private ogranicza widoczność pola jedynie do klasy, w której się znajduje. Dzięki temu nikt z zewnątrz nie może uzyskać informacji, chyba, że klasa będzie posiadać publiczną metodę udostępniającą wartość pola.

Przy słowie kluczowym protected mamy podobnie jak ze słowiem private, tyle tylko, że klasy "dzieci" mogą dostać się do tych pól bezpośrednio. Powodem tego jest to, że są "spadkobiercami" części swojej klasy "matka".

Poniżej, podam wam poprawnie shermetyzowaną klasę, gdzie wartości będzie można uzyskiwać i modyfikować jedynie poprzez metody:

public class SelfishOne {

   private String myPrecious = "Ring";
   private long BigHajs = 999999999;

   public String getLookMyPrecious() {
       return myPrecious;
   }

   public void setMyNewPrecious(String myPrecious) {
       this.myPrecious = myPrecious;
   }

   public long getLookAtBigHajs() {
       return BigHajs;
   }

   public void setBigHajsBigger(long bigHajs) {
       BigHajs = bigHajs;
   }
}

Jak widać na powyższym kodzie, wszystkie pola są prywatne, natomiast wszystkie metody udostępniające dane na zewnątrz są publiczne. Przy użyciu słowa protected, obecny stan kodu nic by nie zmienił

Tak właśnie wygląda kwestia dostępu do danych w klasie. Trzeba pamiętać, że klasa ma być "samolubna" i udostępniać tylko niezbędne informacje innym. W przeciwnym razie, nikt nie powinien mieć możliwości ingerencji w dane wartości pola.

W razie niejasności, proszę wskazać miejsce w poście, a postaram się to doprecyzować ;)

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!