Czy jesteście gotowi na poznanie kolejnego słowa kluczowego dotyczącego dziedziczenia w Kotlinie? "final" w języku Kotlin nie różni się w zastosowaniu absolutnie niczym od języka Java więc ci, którym programowanie we wspomnianym języku nie jest niczym przerażającym, będą mogli szybciutko skorzystać z tego słowa również tutaj! Zapraszam do środka na zapoznanie się z niniejszym materiałem!

"FINAL" W JĘZYKU KOTLIN, CZYLI PONOWNE "ZAMKNIĘCIE"

Zanim rozpiszę się o samym "clue" dzisiejszego wpisu, chcę napisać o jednej wyjątkowości jaka ma miejsce w Kotlinie. Jak już dobrze wiemy, aby właściwość lub metoda mogły podlegać przesłonięciu, trzeba je najpierw "otworzyć" dodając przedrostek w postaci słowa kluczowego "open". Wspomniałem również, że jak raz się cokolwiek otworzy, to już pozostaje otwarte w każdej następnej klasie pochodnej. Właśnie po to służy "final" w języku Kotlin. Aby dosłownie "zamknąć" coś już otwartego i tym samym, uniemożliwić przesłonięcie w kolejnych klasach dziedziczących.

KLASA FINALNA

Zacznijmy standardowo od klasy. Drogą dedukcji mogliście zauważyć, że dlatego Kotlin domyślnie "zamyka" wszystko, bo obok każdego słowa "class" dopisywane jest po cichu "final". Innymi słowy, przykładowa klasa:

class Shape
{
	
}

w rzeczywistości posiada taką definicję:

final class Shape
{
	
}

Na dowód moich słów, spróbujcie sobie dołożyć słowo "final" w języku Kotlin przy użyciu jakiegoś IDE i powinniście zauważyć sugestię, że stoi tam niepotrzebnie i wywołuje redundancję (nadmiarowość). Java nie potraktuje tego nadmiarowo, gdyż tam istotnie trzeba wstawić słowo kluczowe, aby uczynić klasę finalną (odejście od tradycyjnego podejścia Javy, w którym wszystko jest domyślnie otwarte).

WŁAŚCIWOŚĆ FINALNA

"Next, please". Jeśli chodzi o właściwość, a w zasadzie ogólnie zmienną finalną (bo na zewnątrz klasy również może być finalna) to nie występuje nic takiego "stricte". Oczywiście, możemy traktować zmienną w taki sposób:

final val attribute = 15

jednakże nie będzie miało to żadnego wpływu na działanie. Dobre IDE również potraktuje to jako słówko dopisane "na wyrost" więc nie będzie miało znaczenia jak "final" w języku Kotlin znajdzie się w definicji zmiennej. To, czy to ma być stała, czy nie, decyduje przecież słowo kluczowe "val" blokujące możliwość przypisywania innych referencji do obiektów. Ale w Javie tak, to jest ekwiwalent do tego i tam będzie miało wpływ.

JEDYNA użyteczność jest w sytuacji, kiedy klasa jest otworzona i nie chcemy, aby właściwość była edytowana przez kolejne klasy pochodne:

open class Shape
{
	final val attribute = "Stała"
}

W przypadku, gdy właściwość ma być jeszcze nadpisana, to stosujecie kombinację słów "final" i "override" (trzymacie się cały czas tego samego typu danych!):

open class Shape : [klasa bazowa]
{
	final override val attribute = 65
}

METODA FINALNA

Ostatnia część poświęcona na metody finalne. Tutaj już będzie różnica. Kiedy mamy taką sytuację, że otwieramy jakąś klasę:

abstract class Point(tx : Int, ty : Int)
{
	open var x = tx
	open var y = ty
	
	abstract fun draw()
}

mamy drugą klasę pochodną dziedziczącą od tej poprzedniej:

open class Entity(tx : Int, ty : Int, tmodel : String) : Point(tx, ty)
{
	final override fun draw()
	{
		println("Rysuję jednostkę używając modelu $model")
	}
}

oraz jeszcze jedną o takiej strukturze:

open class WoodenCrate(tx : Int, ty : Int) : Entity(tx, ty, "woodenCrate")
{
	
}

To ta ostatnia już nie będzie mogła przesłonić metody "draw", a wszelkie próby skończą się "wyproszeniem za drzwi" w postaci błędu kompilacji.

Słowo kluczowe "final" w języku Kotlin

"final" w języku Kotlin odpowiada za ponowne "zamykanie" klas, właściwości i metod na dalsze przesłanianie, bądź dziedziczenie. Nie wpływa w żaden sposób na zmienne.


I to właściwie tyle z najważniejszych informacji dotyczących słowa kluczowego "final". Dziękuję za pełne przeczytanie.

PODOBNE ARTYKUŁY