Bierzemy się dzisiaj za wyjaśnienie sobie jakie występują modyfikatory dostępu w języku Java! Dowiesz się także po co Ci wiedza o czymś takim i kiedy należy z którego skorzystać. Kolejny istotny wątek, który wymaga dokładnego przestudiowania ✅!
JAKIE MAMY MODYFIKATORY DOSTĘPU W JĘZYKU JAVA?
Java składa się z czterech modyfikatorów dostępu, które definiują one stopień dostępu do składowych klasy (zmiennych i funkcji) poza nią. To, czy ten dostęp jest mniej lub bardziej restrykcyjny, zależy od słowa kluczowego jakiego użyjemy w jednym z czterech miejsc:
- przed typem danych danej składowej klasy (czyt. zmiennej),
- przed typem wartości zwracanej przez metodę,
- przed klasą,
- przed typem wyliczeniowym.
Poznajmy je teraz!
RODZAJE MODYFIKATORÓW DOSTĘPU
Najpierw przedstawię Ci tabelkę, a potem rozwinę każdy z modyfikatorów:
SŁOWO KLUCZOWE | DOSTĘP |
brak (nazywane umownie "default") | wszędzie poza klasą w obrębie tego samego pakietu |
public | wszędzie poza klasą niezależnie od pakietu |
protected | dla klas potomnych i poza klasą w obrębie tego samego pakietu |
private | tylko w obrębie klasy |
Teraz parę zdań komentarza czym się różnią miedzy sobą modyfikatory dostępu w języku Java.
BRAK MODYFIKATORA DOSTĘPU
Pierwszy typ to brak wskazanego modyfikatora, lecz przyjęło się określać go jako "default", choć nie piszemy tego słowa (po prostu nic nie piszemy 😋). Niestety w Javie tak zostało to dziwnie skonstruowane i trzeba wiedzieć, że jeżeli nie ma żadnego modyfikatora dostępu, to jest to "default":
public class MyClass {
int x = 4;
void doSomething() {
}
}
public class Main() {
public static void main(String[] args) {
MyClass mc = new MyClass();
mc.x = 4; // dozwolone, o ile klasa "Main" znajduje się w tym samym pakiecie
mc.doSomething(); // dozwolone, o ile klasa "Main" znajduje się w tym samym pakiecie
}
}
To da taki skutek, że będziesz mógł/mogła się odwołać do metody na zewnątrz klasy poprzez jej instancję (albo z klasy, jeżeli jest statyczna) wyłącznie w obrębie tego samego pakietu. Pakiet w języku Java grupuje pliki źródłowe w jednym katalogu co pozwala na utrzymanie organizacji (więcej o pakietach w załączonym artykule). Dostęp do funkcji nie będzie możliwy, jeżeli będziemy chcieli się na nią powołać z pliku źródłowego należącego do innego pakietu.
PUBLIC
Publiczny modyfikator dostępu przyznaje pełnię praw do uzyskania dostępu na zewnątrz. Zawsze go piszesz przy definicji klasy i nie ma od tego wyjątków. Wysoce zalecany dla metod, gdyż one służą jako środek komunikacji między obiektami. Za to stanowczo Ci odradzam stosowania go dla danych składowych, czyli zmiennych. Kluczową zasadą przy stosowaniu modyfikatorów dostępu jest nieujawnianie szczegółów implementacji. Szczegóły pod sam koniec.
public class MyClass {
public int x = 4;
public void doSomething() {
}
}
public class Main() {
public static void main(String[] args) {
MyClass mc = new MyClass();
mc.x = 4; // dozwolone
mc.doSomething(); // dozwolone
}
}
Jak mawiają, "wszystkie chwyty dozwolone" jeżeli korzystasz z "public".
PROTECTED
Na modyfikatory dostępu w języku Java składa się kolejny typ, który trzeba omówić i to jest "protected". "protected" charakteryzuje się przyznaniem dostępu w nieco niższej swobodzie co "public" bowiem to zapewnia dostęp do składowej na zewnątrz klasy wyłącznie dla tych plików źródłowych, które znajdują się w tym samym pakiecie. NATOMIAST, w przeciwieństwie do "default", pozwala wyłącznie na dostęp przez wszystkie klasy potomne. Można powiedzieć, że jest to taki "prototyp" chronionego modyfikatora dostępu jaki występuje w języku C# (tam nie ma zależności od pakietu):
public class MyClass {
protected int x = 4;
protected void doSomething() {
}
}
public class MyChildClass extends MyClass {
public MyChildClass() {
x = 60; // dozwolone, bo to jest klasa potomna
doSomething(); // dozwolone, bo to jest klasa potomna
}
}
public class Main() {
public static void main(String[] args) {
MyClass mc = new MyClass();
mc.x = 4; // dozwolone, o ile klasa "Main" znajduje się w tym samym pakiecie
mc.doSomething(); // dozwolone, o ile klasa "Main" znajduje się w tym samym pakiecie
}
}
Generalnie "protected" jest bardzo rzadko wykorzystywane, ponieważ jest mało przypadków, w których powinno się przyznać dostęp do składowych klasom potomnym, a nikomu się nie chce ponadto dbać o blokadę dostępu z zewnątrz, bo pliki pochodzą z tego samego pakietu.
PRIVATE
Ostatnim modyfikatorem (i drugim z tych najważniejszych obok "public") jest modyfikator prywatny. "private" używaj ZAWSZE w stosunku do zmiennych, ale też dla metod jeżeli masz pewność, że nie powinny lub nie mają potrzeby być wywoływane na zewnątrz klasy:
public class MyClass {
private int x = 4;
private void doSomething() {
}
}
public class Main() {
public static void main(String[] args) {
MyClass mc = new MyClass();
mc.x = 4; // niedozwolone z powodu prywatnego modyfikatora dostępu
mc.doSomething(); // niedozwolone z powodu prywatnego modyfikatora dostępu
}
}
"private" powoduje zamknięcie drogi do składowej dla każdego bytu z zewnątrz i tylko klasa będąca "posiadaczem" ma do niej dostęp.
Na modyfikatory dostępu w języku Java składają się cztery rodzaje: żaden ("default"), "public", "protected" oraz "private".
NA CO MI TO?
Powód już podałem w opisie modyfikatora "public": ochrona szczegółów implementacji. Programy powinny być tak pisane, jakby były udostępniane dla kogoś innego. Jeżeli użytkownik chce zapisać stan swojej pracy do pliku, nie interesuje go jak to jest robione "pod maską" - jego obchodzi wynik końcowy, żeby zapisać prace, walnąć się spać i następnego dnia wczytać plik, aby kontynuować.
Implementacja musi być ukryta przed światem, ponieważ gdy zechcesz zaktualizować swój program i posiada modyfikacje tych funkcjonalności, które zostały użyte w czyimś innym kodzie źródłowym, to osoba naraża się na poważne edycje tego kodu z powodu ewentualnych zmian w nazewnictwie zmiennych czy ich początkowych wartości. Możesz nawet je całkowicie usunąć, co już kompletnie posypie czyjąś pracę. Właśnie dlatego ochrona implementacji jest tak ważna w programowaniu obiektowym!
Mając nadzieję, że wszystko wytłumaczyłem jasno i klarownie, życzę owocnej nauki i korzystania z modyfikatorów dostępu w sposób rozsądny 😄!