Kotlin:以函数的forms传递对象作为参考,并改变它的实例

我无法find如何传递对象的引用,以便我可以让它们指向内存中的新位置。 Kotlin如何做到这一点?

码:

class Parent { } class Child : Parent { } class GlobalDataHolder { var globalChildVriable: Child? = null // imagine this is a static variable and can be accessed anywhere } class Activity() { var variable1 = Child() Helper.init(variable1, GlobalDataHolder.globalChildVriable) // inside onCreate() } class Helper { initStuff(variable1: Parent, globalVariable: Parent?) { if (globalVariable == null) { globalVariable = variable1 // error saying val cannot be re-assigned } else { variable1 = globalVariable!! } } } 

我想要variable1和globalVariable是可以修改的。 所以他们的原始拥有者将有最新的价值。

Kotlin(和Java)本身不支持像C / C ++那样的引用types。 但是,kotlin确实有属性和functiontypes。
一个属性基本上是两个函数的组合(一个吸气和一个setter)。 您可以传递属性作为参数,并通过reflection,从不同的上下文分别调用其getter setter。

更新(可编译)代码:

 open class Parent { } open class Child : Parent() { } var globalVariable: Child? = null class Activity() { var localVariable = Child() init { Helper.initStuff(this::localVariable, ::globalVariable) } } object Helper { fun initStuff(localProperty: KMutableProperty0, globalProperty: KMutableProperty0) { val globalVariable = globalProperty.call() val variable1 = localProperty.call() if (globalVariable == null) { globalProperty.setter.call(variable1) } else { variableProperty.setter.call(globalVariable) } } } 

通过引入更多层次的抽象,可以“解决”这些问题。 你可以例如添加一个新的interface VarHolder ,它负责获取/设置包含的variables。

 interface VarHandle { var variable: E } class Activity() { var variable1 = Child() fun onCreate() { Helper.initStuff(object : VarHandle { override var variable: Child get() = variable1 set(value) { variable1 = value } }, object : VarHandle { override var variable: Child? get() = GlobalDataHolder.globalChildVariable set(value) { GlobalDataHolder.globalChildVariable = value } }) } } object Helper { fun initStuff(localVarHolder: VarHandle, globalVarHolder: VarHandle) { val globalVar = globalVarHolder.variable val localVar = localVarHolder.variable if (globalVar == null) { globalVarHolder.variable = localVar } else { localVarHolder.variable = globalVar } } }