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函数中,我们可以使用在任何新创建的类中动态地映射函数。