在kotlin中处理getter和setter时出错

时间:2017-04-18 06:24:38

标签: android kotlin getter-setter getter

我已将数据类定义为:

  data class chatModel(var context:Context?) {

      var chatManger:ChatManager?=null
            //getter
        get() = chatManger
            //setter
        set(value) {
            /* execute setter logic */
            chatManger = value
        }

    }

现在我将如何访问get()和set()函数。 在java中我喜欢这样: // for getter

new chatModel().getJId()

// for setter

new chatModel().setJId("jid")

修改

正如@yole建议的那样。我使用setter和getter作为:

//设置数据

var chatDetails:chatModel=chatModel(mApplicationContext)
 chatDetails.chatManger=chatManager

但最终得到java.lang.StackOverflowError:at

com.example.itstym.smackchat.Model.chatModel.setChatManger(chatModel.kt:38)

第38行指向

chatManger = value

此。

@RobCo建议。

我已将数据类定义更改为:

data class chatModel(var context: Context?) {


    var chatManger:ChatManager

    get() = field
    set(value) {
        field=value
    }
}

//设置数据。

    chatModel(mApplicationContext).chatManger=chatManager

//获取不同活动中的数据

chatModel(applicationContext).chatManger

但必须初始化获取错误属性。如果我将它分配给null然后我得到null而不是设置值。

2 个答案:

答案 0 :(得分:3)

你在setter中调用setter .. a.k.a. infinite loop:

    set(value) {
        /* execute setter logic */
        chatManger = value
    }

在属性getter或setter中,还有一个可用的附加变量:field。这表示该属性的java backing field

    get() = field
    set(value) {
        field = value
    }

使用常规var属性,可以自动生成这些getter和setter。 因此,这是默认行为,如果您只是将值设置为字段,则不必覆盖getter / setter。

答案 1 :(得分:1)

重要的是要记住,在代码中引用chatManger ANYWHERE最终会调用getChatManger()setChatManger(),包括getter或setter本身。这意味着您的代码将以无限循环结束并生成StackOverflowError

阅读Properties,特别是关于getter / setter以及“支持字段”的部分。