我已将数据类定义为:
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而不是设置值。
答案 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以及“支持字段”的部分。