Site icon Java blog

Java #6: Hermetyzacja (enkapsulacja)

java encapsulation

Pierwsze prawo programowania obiektowego brzmi: hermetyzacja (encapsulation).

Znasz już pewne podstawy Javy. Wiesz jak pracować na obiektach i jak programować w sposób strukturalny. Czas abyś zrozumiał/a dlaczego programowanie obiektowe jest tak popularne we współczesnym programowaniu. Główne cechy programowania obiektowego to:

– hermetyzacja (lub inaczej enkapsulacja)

– dziedziczenie

– polimorfizm

– abstrakcja (czasami pomijane)

Hermetyzacja to podstawowa cecha każdego języka obiektowego

Jest najprostsza do zrozumienia i najczęściej stosowana (praktycznie zawsze). Dlatego od niej zacznę, ale nie martw się, w przyszłości poznasz trudniejsze zagadnienia takie jak np. polimorfizm. Na razie nie zawracaj sobie nimi głowy, bo nie będą Ci potrzebne. 😉

Co nam daje możliwość enkapsulacji struktur w klasie? Gdy przepisywałeś/aś klasy z poprzednich wpisów od czasu do czasu zauważyłeś/aś tajemnicze słowo public przed metodami lub klasami. Jest to słowo kluczowe w Javie oznaczające, że napisana przez nas klasa, konstruktor, metoda lub pole, będzie dostępna w każdym miejscu projektu. Co prawda już teraz można było odwołać się do metod z innej klasy bez użycia publicznego modyfikatora dostępu, ale tylko dlatego, że wszystkie klasy trzymaliśmy w tym samym pakiecie. Pakietem nazywa się katalog w strukturze projektu Javy, w którym trzymane są klasy o podobnej logice biznesowej.

Jak to działa w praktyce, najlepiej pokazuje przykład niżej.

package manager.model;

public class Resource {
  private String name;
  private Integer id; 
  
  public String getName() {
    return name;
  }
  
  Integer getId() {
    return id;
  }
  
}
package manager.model;

public class Employee {
  public void checkResource() {
    Resource resource = new Resource();
    resource.getName();
    resource.getId(); // dziala, dlatego ze klasy sa w tym samym pakiecie
  }
}
package manager.logic;

import manager.model.Resource;

public class EmployeeEvaluation {
  
  public void checkResource() {
    Resource resource = new Resource();
    resource.getName();
    //resource.getId(); blad, nie ma dostepu do metody
  }
}

Modyfikatory public vs private

Widzisz tutaj, że klasy mogą być posegregowane wedle różnych pakietów. Pakiety mogą być zagnieżdżone w innych pakietach (tak jak katalogi w systemie). Wszystkie klasy, które znajdują się w innych pakietach niż twoja klasa muszą być publiczne, abyś miał możliwość ich użycia. Gdyby modyfikator public nie został użyty w klasie znajdującej się w innym pakiecie niż klasa, w której ją wywołujemy, środowisko programistyczne wykazałoby błąd (w Eclipsie będzie to np.: ‘The method getId() from the type Resource is not visible’).

Co by się stało, gdybyś chciał/a dobrać się do pól w klasie Resource? Nie ma takiej możliwości, ponieważ modyfikator private ’ukrywa’ je przed innymi klasami. Jest to prawidłowe zachowanie, bo pola powinny być traktowane tylko i wyłącznie jako zmienne klasowe a nie globalne. Jeśli chcesz otrzymać wartość takiej zmiennej w innej klasie, powinieneś stworzyć odpowiednią metodę o dostępie publicznym. W tym przypadku jest to getName() (tzw. akcesor lub w wersji angielskiej często używana nazwa to getter).

Pamiętaj:

  1. public – oznacza dostęp do elementu (klasy, metody lub pola) z każdego miejsca projektu. Nie ma znaczenia, w którym pakiecie znajduje się klasa.
  2. package/default – dostęp domyślny lub pakietowy, oznacza, że do elementu może się dostać jedynie klasa z tego samego pakietu. W języku Java nie istnieje słowo kluczowe oznaczające ten rodzaj dostępu. Po prostu brak słowa kluczowego odpowiadającego za dostęp oznacza, że jest on pakietowy. Np. zamiast public void getId() będzie void getId().
  3. private – dostęp prywatny lub inaczej klasowy. Jak sama nazwa wskazuje do elementu można dostać się jedynie z tej samej klasy.
  4. protected – ostatni modyfikator, przydatny głównie przy dziedziczeniu. Nie będę go omawiał na tej lekcji.

Dobre zasady programowania obiektowego (dla początkujących):

Link do lekcji: https://github.com/developeronthego/java-basics/tree/main/src/main/java/basics/lesson6

Podstawy klasy i obiektów: https://developeronthego.pl/java-podstawy-1-typy-danych/

Exit mobile version