Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 函数内部的委托属性_Function_Kotlin_Properties_Delegated Properties - Fatal编程技术网

Function 函数内部的委托属性

Function 函数内部的委托属性,function,kotlin,properties,delegated-properties,Function,Kotlin,Properties,Delegated Properties,我真的不明白为什么我们可以在函数中使用委托属性。我们不能在函数内创建属性,因为在函数内我们只能创建变量 那么,为什么可能在函数内部创建委托属性呢 这行代码是函数中的一个委托属性,我不明白为什么会这样 val scoreFragmentArgs by navArgs<ScoreFragmentArgs>() val scoreFragmentArgs by navArgs() 它有getter和setter,对我来说没有意义Kotlin委托基于存储委托对象,并委托获取/设置对其的更

我真的不明白为什么我们可以在函数中使用委托属性。我们不能在函数内创建属性,因为在函数内我们只能创建变量

那么,为什么可能在函数内部创建委托属性呢

这行代码是函数中的一个委托属性,我不明白为什么会这样

val scoreFragmentArgs by navArgs<ScoreFragmentArgs>()
val scoreFragmentArgs by navArgs()

它有getter和setter,对我来说没有意义

Kotlin委托基于存储委托对象,并委托获取/设置对其的更改。因此,在访问委托变量时,可以内联
getValue
调用

例如:

import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty

object Delegate : ReadOnlyProperty<Any?, Int> {
    override fun getValue(thisRef: Any?, property: KProperty<*>): Int = 42
}

fun main() {
    val foo by Delegate
    println(foo)
}
import kotlin.properties.ReadOnlyProperty
导入kotlin.reflect.KProperty
对象委托:只读属性{
重写fun getValue(thisRef:Any?,属性:KProperty):Int=42
}
主要内容(){
val foo代表
println(foo)
}
Java中的主要方法如下所示:

static final KProperty[]$$delegatedProperties=new KProperty[]{(KProperty)Reflection.property0(new PropertyReference0Impl(Reflection.getOrCreateKotlinPackage(MainKt.class,“123”),“foo”,““”));
公共静态void main(){
System.out.println(Delegate.INSTANCE.getValue(null,$$delegatedProperties[0]);
}

如您所见,访问变量被调用
getValue

所取代,这是创建属性还是仅仅是一个变量?至于原因,函数中的属性而不是变量对GC的影响非常大,因为这意味着每次使用Java中通常简单的变量时都要创建函数对象。对于委托,您显式地声明需要一个已定义的getter和setter,并主动选择创建处理它的对象的开销。