Jason. Cała informatyka w jednym miejscu!

Oto jeden z tematów o jakim dawno było wspomnienie w poprzednich artykułach. Modyfikatory dostępu w języku Kotlin. Różnią się troszkę od Javy więc wgląd w zawartość przyda się nawet zaprawionym w boju "javowcom". Zapraszam!

WYSTĘPUJĄ CZTERY MODYFIKATORY DOSTĘPU W JĘZYKU KOTLIN!

Na początku, definicja. Modyfikator dostępu jest słowem kluczowym określającym poziom widoczności danej składowej, bądź metody znajdującej się w klasie albo jakiegokolwiek innego kodu nienależącego do jakiejkolwiek klasy. W całej gamie podawanych przeze mnie przykładów na stronie, nie używaliśmy żadnych modyfikatorów dostępu. W Javie, trzeba określać jawnie co prywatne, a co publiczne (dobra, nie trzeba, ale jest wysoce zalecane), a w Kotlinie stosuje się tę samą zasadę zapewniania zwięzłości o której napisałem już dosyć dawno, zatem domyślnym modyfikatorem jest publiczny. A teraz poznamy całą resztę.

Język Java "zna" trzy modyfikatory dostępu (czwarty jest ukryty), natomiast Kotlin rozgrywa to troszkę inaczej, dlatego poprosiłem żeby doświadczeni programiści Javy zapoznali się z tym artykułem.

CZWÓRKA MOŻLIWOŚCI!

Przejdźmy teraz do prezentacji. Oto cztery modyfikatory dostępu w języku Kotlin jakich możecie używać w stosunku do danych składowych, metod klas oraz kodu "ogólnie" na zewnątrz. Najpierw opiszę je wszystkie punkt po punkcie, a później postawię obok siebie różnice w stosunku do Javy w formie tabelki.

PUBLIC

Publiczny modyfikator dostępu jest domyślnym modyfikatorem w języku Kotlin (dlatego nie trzeba go wpisywać). Oznacza on widoczność kodu na zewnątrz np. funkcji nienależącej do jakiejkolwiek klasy (trafiłem na określenie "kod głównego poziomu"), danej składowej lub metody klasy z każdego miejsca w kodzie. Efekt można zobaczyć gołym okiem w artykule dotyczącym tworzenia klas w Kotlinie. Wystarczy zdefiniować zmienną albo metodę i można spokojnie się na nią powołać na zewnątrz. O to chodzi.

PRIVATE

"private" jest najbardziej restrykcyjnym modyfikatorem (i jednym z najczęściej wykorzystywanych), który sprawia że dana składowa / metoda / dowolny kod głównego poziomu NIE JEST dostępny dla czegokolwiek z zewnątrz. Dysponując przykładową klasą:

class Point(var x: Int, var y: Int)

jeśli mamy daną składową z modyfikatorem prywatnym:

private val initialX = x

to nikt nie będzie mógł się do niej dostać poza klasą posiadającą tę prywatną właściwość:

fun main(args: Array<String>) {
	val p = Point(6, 2)
	
	println(p.initialX)	// błąd kompilacji
}

I to w zasadzie tyle. To samo tyczy się funkcji, konstruktorów oraz wszystkiego innego w języku Kotlin.

PROTECTED

"Chroniony" modyfikator dostępu nie różni się niczym od prywatnego dla kodu pisanego na zewnątrz klasy. Robi jednak duże znaczenie dla klas pochodnych wykorzystywanych w hierarchii dziedziczenia. Krótko pisząc, jeśli mamy dwie klasy, a jedna z nich dziedziczy po drugiej:

open class Figure

class Rectangle : Figure()

i gdy coś jest "protected":

protected open var x: Int = 6

to dostęp do tego czegoś będzie miała klasa macierzysta ORAZ wszystkie jej klasy pochodne, ale na zewnątrz będzie nadal niewidoczna. Bardzo przydatne kiedy mamy zamiar implementować zachowania wewnątrz klas pochodnych bez udzielania dostępu innym instrukcjom poza jej blokiem. Modyfikator sam w sobie rzadko wykorzystywany podczas programowania.

Jest jeszcze jedna informacja "inclusive". Macie prawo do zmiany modyfikatora dostępu podczas przesłaniania właściwości lub metody w klasie pochodnej (wcześniej musicie nałożyć modyfikator "otwierający")! Na przykład:

public override var x = 80

Tylko uwaga! Możecie to zrobić jedynie w stronę przyznawania większego dostępu zamiast większego ograniczania. Taki manewr musi być zgodny z postulatem dziedziczenia, który mówi że klasa pochodna musi robić wszystko co klasa nadrzędna (chociaż wówczas IDE będzie Wam truć, że "override" jest niekompatybilne z "private")! Nie można zatem sprawić, żeby w klasie potomnej zachodziła większa restrykcja! Dozwolone jest wyłącznie przejście z "protected" na "public".

INTERNAL

A na koniec, ostatni modyfikator który może zostać nazwany "premierą". W przeciwieństwie do wyżej wymienionych, Java nie posiada żadnego "internal" (ma "default", ale to nie jest tożsame!). Posiada go za to Kotlin i oznacza on przyznanie dostępu dowolnemu kodowi głównego poziomu / danej składowej / metodzie w całym module. Według znalezionych przeze mnie informacji, moduł w języku Kotlin należy rozumieć jako grupę plików kompilujących się wspólnie w jednym obiegu. To może być moduł "IntelliJIDEA" albo projekt z wbudowanym narzędziem "Gradle". "internal" działa podobnie jak "public", gdyż zapewnia ono dostępność zmiennej, funkcji, konstruktora lub czegokolwiek innego, zarówno wewnątrz jak i na zewnątrz klasy.

JESZCZE RAZ TO SAMO, TYLKO PORÓWNAMY DO JAVY

Teraz tabelka z porównaniami. Modyfikatory dostępu w języku Kotlin kontra modyfikatory dostępu w języku Java.

MODYFIKATOR ZNACZENIE W KOTLINIE ZNACZENIE W JAVIE
public

widoczność w każdym pliku źródłowym (kod głównego poziomu),

widoczność wszędzie tam, gdzie widoczna jest klasa (właściwość / metoda / konstruktor)

private

widoczność tylko w tym samym pliku źródłowym (kod głównego poziomu),

widoczność tylko wewnątrz klasy (właściwość / metoda / konstruktor)

protected widoczność w klasie nadrzędnej i we wszystkich potomnych widoczność w całym pakiecie, w klasie nadrzędnej i we wszystkich klasach potomnych
internal

widoczność w całym module (kod głównego poziomu),

widoczność wszędzie tam, gdzie widoczna jest klasa (właściwość / metoda / konstruktor)

-
default - widoczność w całym pakiecie

Powtarzam: "internal" działa INACZEJ niż "default"!

Modyfikatory dostępu w języku Kotlin

"public", "private", "protected" i "internal" stanowią modyfikatory dostępu dla określania stopnia widoczności danego kodu, bądź jego fragmentu.


To wszystko na ten temat. Modyfikatory dostępu w języku Kotlin mają swoje haczyki, ale to nie jest temat obszerny. Przy większym zagłębieniu się w szczegóły, można bardziej świadomie posługiwać się nimi wszystkimi.

PODOBNE ARTYKUŁY