2017-10-19 66 views
0

我無法找到如何傳遞對象的引用,以便我可以讓它們指向內存中的新位置。 如何在Kotlin中做到這一點?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!! 
     } 

    } 
} 

我希望變量1和全局變量是可以修改的。 因此,他們的原始擁有者將擁有最新的價值。

+0

請始終編譯後的代碼! – guenhter

+1

Kotlin不支持可變方法參數。 https://discuss.kotlinlang.org/t/method-parameters-and-mutable-variables/333 – TheTechWolf

+0

@guenhter是否有政策來發布編譯代碼?我們可以發佈僞代碼嗎? – iori24

回答

0

通過引入更多級別的抽象,可以「解決」這些問題。例如,您可以添加一個新的interface VarHolder,它負責獲取/設置包含的變量。

interface VarHandle<E> { 
    var variable: E 
} 
class Activity() { 
    var variable1 = Child() 

    fun onCreate() { 
     Helper.initStuff(object : VarHandle<Child> { 
      override var variable: Child 
       get() = variable1 
       set(value) { variable1 = value } 

     }, object : VarHandle<Child?> { 
      override var variable: Child? 
       get() = GlobalDataHolder.globalChildVariable 
       set(value) { GlobalDataHolder.globalChildVariable = value } 
     }) 
    } 
} 

object Helper { 

    fun initStuff(localVarHolder: VarHandle<Child>, globalVarHolder: VarHandle<Child?>) { 
     val globalVar = globalVarHolder.variable 
     val localVar = localVarHolder.variable 

     if (globalVar == null) { 
      globalVarHolder.variable = localVar 
     } 
     else { 
      localVarHolder.variable = globalVar 
     } 

    } 
} 
1

Kotlin(和Java)本身不支持像C/C++那樣的引用類型。 但是,kotlin確實具有屬性和功能類型。
屬性基本上只是2個函數的組合(一個getter和一個setter)。您可以將屬性作爲參數傳遞,並且通過反射,可以分別從不同的上下文中調用其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<out Parent>, globalProperty: KMutableProperty0<out Parent?>) { 
     val globalVariable = globalProperty.call() 
     val variable1 = localProperty.call() 

     if (globalVariable == null) { 
      globalProperty.setter.call(variable1) 
     } 
     else { 
      variableProperty.setter.call(globalVariable) 
     } 

    } 
} 
+0

您好,謝謝。但是我得到了一行類型錯誤:Helper.initStuff。我只是通過傳遞localVariable來跟蹤你的例子 – iori24

相關問題