Jason. Cała informatyka w jednym miejscu!

Zakończyliśmy wspólnie serię artykułów na temat wartości "null", a także jak sobie z nimi radzić przy pomocy słów kluczowych i operatorów oraz jak zapobiegać problemom powstałym w wyniku ich występowania. Nim przejdziemy do następnego "działu" wiedzy, zrobimy jeszcze mały przystanek przy konfrontacji dwóch operatorów porównania, gdyż nawet tutaj może się czaić na Was niespodzianka! Dowiedzcie się podstawowych informacji jak działają dwa operatory porównania obiektów w języku Kotlin, strukturalny i referencyjny!!!

WYSTĘPUJĄ DWA OPERATORY PORÓWNANIA OBIEKTÓW ZAMIAST JEDNEGO!

Zaskoczeni? Znawcy Javy pewnie wyrażą oburzenie twierdząc, że znają tylko "klasyczny" czy "podstawowy" operator porównania w postaci obu znaków równości bez spacji (==). Zgoda, OK. Taki również występuje tutaj pod hasłem "operator strukturalny", jednak oprócz niego, JetBrains dołożyło jeszcze jednego "kolegę" jakim jest operator referencyjny!

OPERATOR REFERENCYJNY? A CÓŻ TO TAKIEGO?

Jest to drugi rodzaj weryfikowania równości obiektów tylko na podstawie referencji. Posługując się nim (===), możemy szybko sprawdzić czy dwa obiekty posiadają ten sam adres do miejsca w pamięci. Co innego gdy stosujemy tzw. "operator strukturalny" (==), gdyż wartość logiczna zależna jest od działania metody "equals" danej klasy (a to powinno już niektórym "Javowcom" dać do myślenia).

Matematycy mogą to nazywać "operator tożsamościowy" z powodu identycznej symboliki. Jednak jeśli mowa o języku Kotlin, tutaj mamy operator referencyjny, zatem mamy DWA operatory porównania obiektów zamiast jednego! Obejrzyjmy teraz dwa te operatory w akcji. Najpierw strukturalny.

DZIAŁANIE OPERATORA STRUKTURALNEGO

Operator strukturalny można nazwać "klasycznym operatorem porównania". Tworzy się go stosując dwa znaki równości postawione obok siebie nierozłącznie (==). Zwraca prawdę wtedy i tylko wtedy, gdy porównywane ze sobą obiekty są uznane za równe w wyniku działania metody "equals" kontrolującej "uznawanie" obiektów za sobie równe. "equals" należy do "paczki" metod posiadanych przez klasę nadrzędną wszystkich klas, "Any" i w każdej chwili można ją przesłonić oraz zdefiniować niestandardowe kryterium, pamiętając o najważniejszej zasadzie "równości" obiektów:

a.equals(b) == b.equals(a) <=> a.hashCode() == b.hashCode()

Na ludzki język: jeśli oba obiekty mają być uznane za równe, muszą mieć identyczne kody mieszające! Ale jeśli oba obiekty zwracają ten sam kod mieszający, jeszcze nie musi to świadczyć o ich "równości". To działa jak "jednostronna umowa". I zapamiętać na całe życie! Jeśli przesłaniamy metodę "equals", to musimy też przesłonić "hashCode"!

Proste typy danych, poddane działaniu operatora strukturalnego (jak również referencyjnego), zawsze zwrócą prawdę jeżeli wartości są takie same, a adresy takie same, bądź inne. Obejmuje to oba operatory porównania obiektów w języku Kotlin:

val a = "Kotlin"
val b = "Kotlin"

println(a == b)

Klasy danych są przykładem niestandardowego zachowania metody "equals". Choć ich implementacje są ukryte, gdyż nie musimy ich przesłaniać ręcznie, to oba obiekty będą uznane za równe jeśli wszystkie dane składowe zdefiniowane w konstruktorze podstawowym mają identyczne wartości, co ten drugi, a mogą być dwiema różnymi instancjami:

data class Person(val name: String, val surname: String, val age: Int)

val personA = Person("Tadeusz", "Kościuszko", 56)
val personB = Person("Tadeusz", "Kościuszko", 56)

println(personA == personB)

Zwykłe klasy wymagałyby naszej interwencji, żeby identyfikacja ich "równości" działała w taki sam sposób. Musielibyśmy prawdopodobnie nałożyć koniunkcję na metodę "equals" i dobre wyrażenie kalkulujące kod mieszający w metodzie "hashCode".

DZIAŁANIE OPERATORA REFERENCYJNEGO

Operator referencyjny działa zupełnie inaczej. Porównanie w tym przypadku nie sugeruje się implementacją metody "equals" tylko czy oba obiekty posiadają ten sam adres, dzięki którym można dostać się do identycznej komórki pamięci. Inaczej pisząc, czy dwa obiekty wskazują na ten sam obiekt, czyli mają identyczną referencję. Oto cała różnica pomiędzy jednym, a drugim.

Operatory porównania obiektów w języku Kotlin

Operatory porównania obiektów w języku Kotlin, strukturalny i referencyjny, działają zupełnie inaczej od siebie i sugerują się innym czynnikiem.


Drobny szczegół, a robi różnicę. Teraz już wiecie jaki diabeł tkwi w szczegółach jak skorzystacie z dwóch albo trzech znaków równości.

PODOBNE ARTYKUŁY