在处理kotlin中的getter和setter时出错
我已经将数据类定义为:
data class chatModel(var context:Context?) { var chatManger:ChatManager?=null //getter get() = chatManger //setter set(value) { /* execute setter logic */ chatManger = value } }
现在我将如何访问get()和set()函数。 在Java中,我喜欢://对于getter
new chatModel().getJId()
//对于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,那么我得到的不是设定值。
你在setter里面调用setter ..又名无限循环:
set(value) { /* execute setter logic */ chatManger = value }
在属性getter或setter中,有一个额外的变量可用: field
。 这表示该属性的java 支持字段 。
get() = field set(value) { field = value }
使用常规的var属性,这些getter和setter是自动生成的。 所以,这是默认的行为,你不必重写getter / setter,如果你只是把值设置为一个字段。
请务必记住,在代码中引用chatManger
最终会调用getChatManger()
或setChatManger()
,包括getter或setter本身。 这意味着你的代码将会以无限循环结束并导致StackOverflowError
。
阅读属性 ,特别是关于getters / setters以及“后台”的部分。