Sobes.tech
Junior

Šta su ekstenzije u programskom jeziku Kotlin?

sobes.tech АИ

Одговор од АИ

Разширења у Kotlin-у омогућавају додавање нових функција или својстава постојећим класовима без наслеђивања или коришћења декоратора.

Основне концепције:

  • Функције за проширење (Extension Functions): Додају нове методе класовима.

    // Дефинисање функције за проширење
    fun String.removeWhitespaces(): String {
        return this.filter { it.isWhitespace().not() }
    }
    
    // Коришћење функције за проширење
    val myString = " Hello World "
    val cleanedString = myString.removeWhitespaces() // cleanedString ће бити "HelloWorld"
    

    Кључна реч this унутар функције за проширење се односи на објекат на који се примењује проширење (у примеру горе на myString).

  • Својства за проширење (Extension Properties): Омогућавају додавање нових својстава класовима, али не могу имати стање, тј. не могу чувати податке. Они се израчунавају при сваком позиву.

    // Дефинисање својства за проширење
    val <T> List<T>.lastIndex: Int
        get() = size - 1
    
    // Коришћење својства за проширење
    val myList = listOf(1, 2, 3)
    val indexLast = myList.lastIndex // indexLast ће бити 2
    

    Својства за проширење морају имати геттер. Сеттери су опциони.

Особине:

  • Статичка дистпетчеризација: Позив проширења се одређује типом променљиве, а не типом објекта током извршавања. Ово се разликује од виртуелних метода у објектно-оријентисаном програмирању.

    open class Parent
    class Child : Parent()
    
    fun Parent.printType() = println("Parent")
    fun Child.printType() = println("Child")
    
    val p: Parent = Child()
    p.printType() // Исписа "Parent", јер је тип променљиве 'p' - Parent
    
  • Приватни и заштићени чланови: Проширења не могу приступити приватним или заштићеним члановима класе коју проширују.

  • Проширења за објекте-компаньоне: Могу се проширити објекти-компаньони класе.

    class MyClass {
        companion object {
            fun create() = MyClass()
        }
    }
    
    fun MyClass.Companion.printName() = println("MyClass Companion")
    
    MyClass.printName() // Исписа "MyClass Companion"
    
  • Област видљивости (Visibility): Проширења морају бити објављена у датотеци и потом увезена за коришћење у другим датотекама.

Проширења су моћан алат за стварање читљивог и флексибилног кода, омогућавајући додавање функционалности класовима из спољних библиотека без измене њиховог изворног кода.