Kotlin - Extension Functions (Funkcje rozszerzające)

Kotlin jako język wspiera funkcje rozszerzające (Extension functions). Pozwalają one rozszerzyć daną klasę o funkcjonalności bez używania dekoratorów lub dziedziczenia.

W tym przypadku programiści najczęsciej patrzą w stronę klas Utils, gdyż kotlin skutecznie pozwala zredukować ich użycie.

Zobaczmy jak wyglądają różnice w kodzie javy z klasą Utils - Collection i kotlina z funkcjami rozszerzającymi.

// Java
Collections.swap(list, Collections.binarySearch(list, Collections.max(otherList)), Collections.max(list));
// Kotlin
list.swap(list.binarySearch(otherList.max()), list.max());

Pierwszą zaletą jest to, że nie musimy za każdym razem odwoływać się do klasy (w tym przypadku Collections) tylko od razu wywołać funkcję na obiekcie.

Drugą ważną rzeczą jest to, iż nie trzeba podawać obiektu, na którym chcemy operować poprzez argument.

Własności funkcji rozszerzających

W kotlinie takie funkcje przejmują większość właściwości z normalnych funkcji:

Kotlin i Android

Programując na system Android używa się ogromnej liczby klas Utils.

Bywa jednak tak, że użycie ich składni jest długie i nieporęczne.

I tak funkcje rozszerzające (Extension functions) okazały się być czytelniejszą alternatywą dla programistów androida. Poniżej przedstawię kilka dość znanych przykładów.

//Funkcja rozszerzajaca
fun Activity.toast(message: String) {
    Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}
//Pozniejsze uzycie
toast("Wyswietl mnie :)")

Prawda, że ograniczenie toast'ów do takiej formy znacznie upraszcza i życie i kod?

//Funkcja rozszerzajaca
fun ViewGroup.inflate(layoutRes: Int): View {
    return LayoutInflater.from(context).inflate(layoutRes, this, false)
}
//Pozniejsze uzycie
parent.inflate(R.layout.view_item)

Bardzo przydatne jest także skrócenie LayoutInflater'a wszędzie tam gdzie musimy odnosić się do zewnętrznych layout'ów.

//Funkcja rozszerzajaca
fun String.toUri(): Uri {
    return Uri.parse(this)
}
//Pozniejsze uzycie
val uri = someString.toUri()

To użycie może znacznie kodu nie skraca, ale za to możemy wykonać funkcję na obiekcie String.

Android KTX

Od kiedy Google na swoim wydarzeniu Google I/O ogłosił Kotlin'a jako oficjalny język dla aplikacji wielu programistów zainteresowało się jego realnym wprowadzeniem.

Od niedawna do android'a można zaimplementować paczkę Android KTX z Github.

Jest ona niczym innym jak zbiorem przydatnych funkcji rozszerzeń (Extension Functions), dla ludzi pracujących w Androidzie.

Android KTX można też zaimplementować ze strony Android Developers.

Kotlin:

view.viewTreeObserver.addOnPreDrawListener(
    object : ViewTreeObserver.OnPreDrawListener {
        override fun onPreDraw(): Boolean {
            viewTreeObserver.removeOnPreDrawListener(this)
            actionToBeTriggered()
            return true
        }
    })

Kotlin z Android KTX:

view.doOnPreDraw {
     actionToBeTriggered()
}

shop
Otwórz Sklep Play

Zachęcam cię do odwiedzenia mojej strony na Google Play store i sprawdzenia wszystkich moich aplikacji.