Nauka programowania Java #6: Hermetyzacja

Pierwsze prawo pragramowania obiektowego: 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

– dziedziczenie

– polimorfizm

– abstrakcja (czasami pomijane)

Hermetyzacja to podstawowa cecha każdego języka obiektowego. Jest najprostsza do zrozumienia i naczęś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ś klasyz 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, 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(); // error, nie ma dostepu do metody
  }
}
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 modifikator 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().

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):

  • Pisz pola z prywatnym modyfikatorem i publicznymi getterami i stetterami.
  • Metody ogólnodostępne powinny być public.
  • Jeśli kod powtarza się w kilku metodach tej samej klasy lub gdy ciało metody jest bardzo długie, to warto rozważyć, czy tą część kodu nie dałoby się przenieść do mniejszej metody o dostępie klasowym (prywatnym).
  • Konstruktory i klasy z reguły piszemy z modyfikatorem public.

Dodaj komentarz