Propiedades delegadas en Kotlin

La delegación se define como el otorgamiento de cualquier autoridad o poder a otra persona (Jefe asignando tareas a sus empleados) para llevar a cabo un trabajo diferente. Sin embargo, la persona que delegó el trabajo sigue siendo responsable del resultado del trabajo delegado. De manera similar, hay varios tipos de propiedades en un lenguaje de programación que podemos implementar manualmente cada vez que queramos usarlos para delegar otro trabajo de código y podemos implementarlos de una vez por todas y ponerlos en la biblioteca si se usan continuamente en nuestro programa.

Clasificación

Hay principalmente 3 tipos de propiedades utilizadas para la delegación:

1. Propiedades perezosas: Lazy es una función lambda que toma la propiedad para implementar la entrada y devolver una instancia de Lazy donde T denota el tipo de propiedad que se usa para implementar la propiedad perezosa. De forma predeterminada, lazy está sincronizado significa que el valor se calcula en la primera llamada y el mismo valor también se devolverá en otras llamadas, podemos detener la sincronización usando LazyThreadSafetyMode.PUBLICATION como parámetro de la función. 

Ejemplo:

Kotlin

// Defining an immutable variable in kotlin
val lazyValue: String by lazy
{
  // Printing to standard output
  println("GeeksforGeeks")
  "GeeksforGeeks"
}
 
fun main()
{
  // Printing Var lazyValue values to standardoutput
  println(lazyValue)
  println(lazyValue)
}

Producción:

GeeksforGeeks
GeeksforGeeks
GeeksforGeeks

Explicación:

Aquí, el valor se calcula solo en «println», e println llama a lazyValue y el valor en println se imprime como salida y todas las devoluciones de llamada verán el mismo valor debido a la sincronización.

2. Propiedades observables: notifica al usuario sobre los cambios realizados en la clase utilizando el controlador que contiene información sobre los cambios que se están produciendo. Se utiliza para recibir notificaciones a través de devoluciones de llamada cada vez que cambia la propiedad. Contiene dos argumentos para inicializar el objeto, nueva propiedad o valor (el valor inicial) y un controlador que contiene información sobre todas las modificaciones que haremos al asignar la entrada al objeto (contiene una propiedad para asignar, valor antiguo, el nuevo valor asignado).

Ejemplo:

Kotlin

import kotlin.properties.Delegates
 
class Myself
{
  // Creating a Myself Class with String variable name
  var name: String by Delegates.observable("company name")
  {
    // default Previous value "company name"
    prop, old, new ->
    println("$old -> $new") // Old value is being
                             // assigned a new value
  }
}
 
fun main()
{
  // Assigning name variable default value
  val V1 = Myself()
   
  // Assigning name variable a new value "Previous to"
  V1.name = "Previous to"
   
  // Now again changing "Previous to " to "New Value" value
  V1.name = "New Value"
}

Producción: 

company name -> Previous to
Previous to -> New Value

Explicación:
Aquí las propiedades observables toman dos argumentos, el valor inicial como “nombre de la empresa” y segundo el handler al cual llamamos cada vez que le asignamos a la propiedad con tres valores como “propiedad a modificar, el valor anterior y el valor nuevo .

3. Vetable: Nos permite modificar los valores cuando el argumento ingresado por el (los) usuario (s) cumple la condición especificada, se puede usar en lugar de las propiedades observables si el usuario desea interceptar la asignación. Vetoable es como las propiedades observables con características adicionales que permiten modificar y notificar los valores cuando se cumple la condición.

Ejemplo: 

Kotlin

var max: Int by Delegates.vetoable(0)
{
  // Defining variable max with vetoable default value as 0
  property, oldValue, newValue ->
  newValue > oldValue
}
 
// printing value of max valriable default zero
println(max)
 
// assigning new value to max variable
max = 10
 
// printing newly assigned value to max variable
println(max)
 
// assigning new value to max variable but it
// doesnot satisfy max condition
max = 5
 
println(max)

Producción: 

0
10
10

Explicación:

En primer lugar, se imprime el valor predeterminado y luego, se asigna el nuevo valor máximo y el valor no se cambió cuando se invocó nuevamente la devolución de llamada anterior debido a que no se cumplió con la propiedad. Cuando la devolución de llamada devuelve verdadero, significa que el valor de la propiedad se cambia a un nuevo valor; de lo contrario, el nuevo valor se descarta y la propiedad aún contiene su valor antiguo (anterior).

4. Almacenamiento de propiedades en un mapa: este método se utiliza para almacenar propiedades en una función de mapa y utilizarlas para aplicaciones dinámicas. 

Ejemplo: 

Kotlin

class Myself(val map: Map<String, Any?>)
{
  // defining class Myself
  val my_name: String by map // Variable my_name
  val my_age: Int     by map // Variable my_age
}
 
// calling Myself class using map function and
// assigning value to my_name and my_age variables
fun main()
{
  val V1 = Myself(mapOf(
        "my_name" to "GeeksforGeeks",
        "my_age"  to 50))
   
  // Printing value of my_name variable
  println(V1.my_name)
   
  // Printing value of my_age variable
  println(V1.my_age) 
}

Producción:

GeeksforGeeks
50

Esto también funciona para las propiedades de var si usa un mapa mutable en lugar de un mapa de solo lectura

Explicación:
aquí creamos una clase Myself, que contiene una función de mapa, para aceptar la entrada en forma de string o cualquiera (int, float, string, etc.) y almacenarlos en las variables my_name y my_age en la función de mapa dentro de mi clase y podemos use la función de mapa dinámicamente dentro de cualquier clase recién creada también.
 

Publicación traducida automáticamente

Artículo escrito por vipulpahuja y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *