📜  Kotlin 中的委托属性

📅  最后修改于: 2022-05-13 01:55:05.063000             🧑  作者: Mango

Kotlin 中的委托属性

授权被定义为将任何权力或权力授予另一个人(老板将任务分配给其员工)以执行不同的工作。但是,委派工作的人仍然对委派工作的结果负责。类似地,编程语言中有各种类型的属性,每次我们想使用它们来委托其他代码工作时,我们都可以手动实现它们,我们可以一劳永逸地实现它们,如果持续使用它们,我们可以将它们放入库中。我们的节目。

分类

主要有 3 类用于委托的属性:

1. 惰性属性:惰性是一个 lambda函数,它接受属性来实现输入并返回一个惰性实例,其中 T 表示用于实现惰性属性的属性类型。默认情况下,lazy 是同步的,意味着在第一次调用时计算该值,并且在其他调用中也将返回相同的值,我们可以使用 LazyThreadSafetyMode.PUBLICATION 作为lazy()函数的参数来停止同步。

例子:

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)
}


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"
}


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)


Kotlin
class Myself(val map: Map)
{
  // 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) 
}


输出:

GeeksforGeeks
GeeksforGeeks
GeeksforGeeks

解释:

这里,该值仅在“println”中计算,并且 println 调用lazyValue 并将 println 中的值打印为输出,并且由于同步,所有回调将看到相同的值。

2. 可观察的属性:它通知用户有关使用处理程序对类所做的更改,其中包含有关发生更改的信息。它用于在属性更改时通过回调获得通知。它包含两个参数来初始化对象,新属性或值(初始值)和处理程序,其中包含有关我们将通过将输入分配给对象进行的所有修改的信息(它包含要分配的属性,旧值,分配的新值)。

例子:

科特林

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"
}

输出:

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

解释:
这里的可观察属性有两个参数,初始值为“公司名称” ,第二个是我们每次将其分配给属性时调用的处理程序,其中三个值分别为“要修改的属性、先前值和新值”。

3. Vetoable:它允许我们在用户输入的参数满足指定条件时修改值,如果用户想要拦截分配,它可以用来代替可观察的属性。 Vetoable 类似于具有附加功能的 Observable 属性,允许在满足条件时修改和通知值。

例子:

科特林

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)

输出:

0
10
10

解释:

首先打印默认值,然后分配新的最大值,并且由于未能满足属性而再次调用上述回调时,该值没有更改。当回调返回 true 时,意味着属性的值被更改为新值,否则新值被丢弃并且属性仍然包含其旧(先前)值。

4. 在地图中存储属性:此方法用于将属性存储在地图函数中,并将其用于动态应用程序。

例子:

科特林

class Myself(val map: Map)
{
  // 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) 
}

输出:

GeeksforGeeks
50

如果您使用可变映射而不是只读映射,这也适用于 var 的属性

解释:
在这里,我们创建了一个 Myself 类,其中包含一个 map函数,用于接受字符串或任何形式的输入(int、float、 字符串等)并将它们存储在 my_name 和 my_age 变量中的 my_name 和 my_age 变量中的 map函数中,我们可以使用在任何新创建的类中动态地映射函数。