¿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.
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 llamaViewExtension.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 this
hace 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 TextView
y después si ese texto es vacío hacer que ese ese TextView
se 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
}
}
Conclusiones
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.
Te esperamos en los siguientes artículos en donde hablaremos mas acerca de estos temas, los cuales hoy en día son de vital importancia en el mundo de la tecnología.