Asercja wartości niepustej w języku Kotlin stanowi odrębny fragment tematu wartości "null" i takiej ich obsługi, żeby nie trzeba było liczyć się z dużą ilością błędów. Poznajcie tajniki wspomnianego pojęcia i wykorzystajcie to jak najszybciej w praktyce!
Tweet |
ASERCJA WARTOŚCI NIEPUSTEJ W JĘZYKU KOTLIN NOWYM OPERATOREM DO KOLEKCJI
Na sam początek trzeba sobie wyjaśnić pokrótce czym jest asercja. Asercja to forma zdaniowa zwracająca prawdę lub fałsz. W opisywanym przypadku, chodzi o odpowiedź na pytanie "czy obiekt poddawany asercji jest równy »null«"? Tak lub nie.
W programowaniu, asercja przerywa działanie aplikacji jeśli zostanie zwrócona wartość fałszywa. Wykorzystywane jest to w przeprowadzaniu testów jednostkowych mających na celu sprawdzenie poprawności działania oprogramowania, jak i samych wyników funkcji oraz algorytmów. W zależności od języka programowania, asercja najczęściej przyjmuje postać funkcji (np. język C), bądź słowa kluczowego (np. Java). Bywa też, że najpierw trzeba ją "włączyć" lub przejść na tryb debugowania. Określenia i ustawienia są różne, to również zależy od języka.
W niniejszym artykule, przypatrzymy się jak działa asercja wartości niepustej dla sprawdzania wartości "null" w obiekcie akceptującym wartość pustą. Na samą końcówkę zamykając teorię, po co to. Ano po to, żeby w razie wykrycia wartości "null", zgłosić wyjątek "NullPointerException" – znana wszystkim programistom Javy "paskuda", która często jest przyczyną potencjalnego natychmiastowego zamknięcia aplikacji (miałem taki przypadek programując aplikację w Android Studio). Wiedząc jednak w którym miejscu i w wyniku czego takowy wyjątek może wystąpić, może zachęcić programistę do zaprogramowania obsługi wyjątków na tym tle.
NOWY OPERATOR?
Wspomniałem o operatorze. Tak, to w gruncie rzeczy jest kolejny operator w postaci dwóch wykrzykników (!!). To jest właśnie asercja wartości niepustej w języku Kotlin. A teraz przykład w kodzie pisany.
Przypuśćmy, że chcemy dostać się do właściwości obiektu przyjmującego wartości puste. Załóżmy też, że mamy kaprys tego rodzaju, że jak nie będzie możliwe dostanie się do właściwości o którą nam chodzi, to chcemy to sobie "nagłośnić" prowokując wyjątek. Kod źródłowy wykorzystujący asercję wartości niepustej (uznany za poprawny od strony składni) może wyglądać w poniższy sposób. Wykorzystamy tę samą klasę danych jakiej używaliśmy w ramach przykładu podczas omawiania klas danych:
data class Person(val name: String?, val surname: String? = "Anonim", val age: Int?)
var person: Person? = Person(null, null, null)
println(person?.age!!)
Jeśli asercja wartości niepustej Wam umknęła, to znajduje się w środku wywołania "println". Najpierw sprawdzamy poprzez bezpieczne odwołanie czy obiekt akceptujący wartości puste nie jest "pusty" w chwili obecnej. Jeżeli NIE, to program przechodzi do właściwości "age" i od tego punktu, mogą stać się dwie rzeczy:
- wartość właściwości "age" zostanie "uznana" za wartość niepustą i zwrócona do parametru funkcji "println" (przypadek optymistyczny)
- wartość właściwości "age" będzie wartością "null" i program zgłosi w tym miejscu wyjątek (przypadek pesymistyczny)
Widzicie tę różnicę? W przypadku bezpiecznego odwołania, to zwracał tylko "null" i koniec pieśni (można to nazwać "zamiataniem pod dywan"), ale asercja została stworzona po to, aby "alarmować" brak przypisanej referencji do obiektu i robić z tego problem uniemożliwiający kontynuowanie przebiegu aplikacji.
Ważna rzecz na którą chcę tak na marginesie zwrócić waszą atencję to to, że asercja wartości niepustej w języku Kotlin zastępuje bezpieczne wywołanie. Nie można wstawić jednego i drugiego. Jest "albo, albo". Asercja zadziała także, kiedy wykryje "null" gdziekolwiek indziej w całym "łańcuszku" odwołań (w tym wypadku, może się przyczepić braku referencji w zmiennej "person"):
person = null
println(person?.age!!)
Asercja wartości niepustej przydaje się do czynności debugujących aplikację w poszukiwaniu potencjalnych wystąpień wyjątków "NullPointerException".
Asercja wartości niepustej w języku Kotlin została już zaprezentowana jako kolejna broń do walki z nieprzyjemnymi skutkami wartości "null", chociaż działa zdecydowanie lepiej w zadaniach dotyczących debugowania programu i alarmowania o przypadkach znalezionych wartości "null". Dziękuję, to wszystko!