Skoro poruszyłem wątek z rzutowaniem typów w poprzednim artykule, najlepiej będzie teraz napisać o drugim słowie kluczowym na to pozwalającym. Poznajcie teraz słowo "as" w języku Kotlin, czyli jak i w jakim wypadku trzeba rzutować typ jawnie.

"AS" W JĘZYKU KOTLIN NA SYTUACJE, W KTÓRYCH KOTLIN SOBIE SAM NIE PORADZI

Już odpowiedziałem na pytanie do czego to może się przydać. Wszędzie tam, gdzie słowo "is" może mieć problemy. A jak wspomniałem poprzednio, inteligentne rzutowanie spełznie na niczym jeżeli pomiędzy sprawdzaniem typu, a wykonywaniem instrukcji w oparciu o obiekt rzutowany na inny typ, powstanie ryzyko możliwości modyfikacji tego typu. A kiedy to się może przytrafić?

KIEDY INTELIGENTNE RZUTOWANIE NIE WYPALI?

Przykładowa sytuacja może być taka. Wasza klasa posiada zmienną utworzoną za pomocą słowa kluczowego "var" ze zdefiniowaną wartością o innym typie danych niż podany po dwukropku. Na przykład:

var attribute : Any = 67

W rzeczywistości to jest "Int", ale przypisujemy typ "Any" - matkę wszystkich obiektów, odpowiednik "Object" w języku Java. Do tego, wyobraźmy sobie taką metodę, w której wstawiamy instrukcję warunkową sprawdzająca typ "inteligentnie":

fun doSomething()
{
	if(attribute is Int)
	{
		println("${attribute.inc()}")
	}
}

W tej sytuacji "as" w języku Kotlin okaże się wybawieniem. Tym razem, "smart cast" nie podoła wyrażeniu "test.inc()" (zwrócenie liczby po inkrementacji) i pojawi się błąd kompilacji o takiej treści:

Błąd inteligentnego rzutowania w języku Kotlin

Treść przyczyny błędu powstałego w wyniku próby inteligentnego rzutowania.

Kicha! A to dlatego, że pomiędzy sprawdzaniem typu, a wykonaniem instrukcji, zmienna jest narażona na modyfikację pomiędzy tymi czynnościami. To jest "var", zatem co szkodzi wstawić obiekt innego typu podmieniając referencję?

Do akcji ratunkowej wkracza wtedy słowo "as". "as" w języku Kotlin też służy do rzutowania na inny typ danych jednakże teraz odpowiadamy za to MY. Określa się to wtedy jawnym rzutowaniem typu obiektu. Zobaczmy jak to się robi.

JAWNE RZUTOWANIE TYPU

Wracając do poprzedniej sytuacji, która nie skończyła się szczęśliwie:

var attribute : Any = 56

fun doSomething()
{
	if(attribute is Int)
	{
		println("${attribute.inc()}")
	}
}

przy użyciu jawnego rzutowania typu przy pomocy słowa kluczowego "as", możemy sami wpłynąć na typ biorąc na barki odpowiedzialność za wszelkie potencjalne błędy z tym związane, choć mamy możliwość skorzystania z bezpiecznego rzutowania stawiającego się wartościom "null":

if(attribute is Int)
{
	val i = attribute as Int
	
	println("${i.inc()}")
}

Prześledźmy na spokojnie zmiany. Po pierwsze, utworzyliśmy sobie nową zmienną o nazwie "i", która ma "robić" za zweryfikowany typ. Używając słowa kluczowego "as", łączymy po obu stronach nazwę oryginalnej zmiennej z typem konkretnym. W ten sposób "attribute as Int", spowoduje potraktowanie zmiennej, można napisać "podejrzanej o bycie" liczbą całkowitą, jak prawdziwy "Int".

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

"as" w języku Kotlin umożliwia rzutowanie w sposób jawny, dzięki czemu możemy uniezależnić się od decyzji kompilatora i "postawić na swoim". Ponosimy wtedy odpowiedzialność za wszelkie potencjalne błędy.


Jaki stąd wniosek? Hasło "as" to przydatna rzecz w chwili, kiedy inteligentne rzutowanie nie chce angażować się w ryzykowne gierki, w których może dojść do modyfikacji typu danych pomiędzy weryfikacją, a egzekwowaniem.

PODOBNE ARTYKUŁY