¿Qué es una función de extensión?

Vamos a comenzar explicando qué es una función de extensión de Kotlin. No es más que una función que añade una funcionalidad a una clase, y lo más importante es que no tenemos que tener acceso al código ni extender la clase, ya que lo que haremos será darle una nueva funcionalidad creando un método, lo que resulta muy sencillo.

Ventajas que aportan

Las ventajas que nos aporta el uso de funciones de extensión son las siguientes:

  • Añadimos funciones extras a clases ya existentes, sin tener acceso en ningún momento al código. El único inconveniente es que no tenemos acceso a sus variables privadas ni métodos privados.
  • No es necesario pasar el objeto como argumento
  • Actúa como un método más de la clase, por lo que podemos usar sus métodos públicos.
  • Pueden añadir también propiedades. Si tenemos una vista podemos extenderla con propiedades. Es una de las funcionalidades más importantes y empleadas en Android.
Imagen 0 en Aplicando funciones de extensión de Kotlin en Android

Ejemplos de funciones de extensión

Tenemos un proyecto dónde podemos ver las funciones de extensión que están definidas, por ejemplo las funciones de extensión de vistas, que se llama ViewExtension.kt, que recoge extensiones de vista, sin necesidad de crear una clase ni nada más. Dentro del mismo tenemos una función de extensión sobre View el que vamos a comprobar si la vista es visible o no, función que nos retorna un boolean:


fun View.isVisible() : Boolean {
      return this.visibility == View.VISIBLE
}

Es importante indicar que hace uso del contexto, ya que thishace referencia a las propiedades que tiene view, por lo tanto tenemos acceso a todas sus propiedades públicas y métodos públicos. Por ejemplo, si tenemos una variable como titleLabel y queremos consultar si es visible o no, en el código de activity incluiríamos lo siguiente:

titleLabel.isVisible () o bien, titleLabel.value.isVisible ()

Dependiendo de si hacemos una inicialización de tipo Lazy o normal, y así ya tendríamos acceso a esa función.

Otro ejemplo, si tenemos una función ImageView y quisiéramos crear una función de extensión para que cargue una imagen con Picasso, simplemente habría que declarar esa función en una variable a la que le pasaríamos el String y automáticamente cargaría la url indicada con Picasso, de esta forma:


fun ImageView.loadUrl(url: String) {
      Picasso.with(this.context).load(url).into(target: this)
}

En el código de activity utilizaríamos esta función de extensión de esta forma:


image.value.loadUrl(url:”https://www.linuxadictos.com/wp-content/uploads/openwebinars-logo.jpg”)

También se pueden crear funciones de extensión por ejemplo para la RecyclerView. En este caso haremos una función de extensión de RecyclerView llamada setUp a la que le pasamos un LayoutManager y un adapter, de la siguiente forma:

fun RecyclerView.setUp(layoutManager: RecyclerView.LayoutManager, 
                          adapter: RecyclerView.Adapter) {
       this.layoutManager = layoutManager
       this.adapter = adapter
} 

Otra función de extensión muy común es por ejemplo setear un texto a un TextViewy después si ese texto es vacío hacer que ese ese TextViewse haga invisible. Esto se haría de esta forma:


fun TextView.setTextAndHideViewIfNeeded(text: String) {
       if (¡TextUtils.isEmpty(text)) {
            this.text = text
            this.visibility = View.VISIBLE
       }  else  {
            this.text = “”
            this.visibility = View.GONE
       }
}

Conclusión final

Las funciones de extensión nos ofrecen muchas posibilidades y nos ayudan a simplificar mucho el código, y es una de las mejores ventajas que ofrece Kotlin y por las que merece la pena pensar en migrarse al desarrollo en este lenguaje de programación.