Android 在kotlin中处理getter和setter时出错
我已将数据类定义为:Android 在kotlin中处理getter和setter时出错,android,kotlin,getter-setter,getter,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
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()
//二传手
new chatModel().setJId("jid")
编辑:
正如@yole所暗示的那样。我使用setter和getter作为:
//设置数据
var chatDetails:chatModel=chatModel(mApplicationContext)
chatDetails.chatManger=chatManager
但是最终得到java.lang.StackOverflower错误:在
com.example.itstym.smackchat.Model.chatModel.setChatManger(chatModel.kt:38)
第38行指向
chatManger = value
这个
@罗布科建议
我已将数据类定义更改为:
data class chatModel(var context: Context?) {
var chatManger:ChatManager
get() = field
set(value) {
field=value
}
}
//设置数据
chatModel(mApplicationContext).chatManger=chatManager
//在不同的活动中获取数据
chatModel(applicationContext).chatManger
但是必须初始化getting error属性。如果我把它赋值为null,那么我得到的是null而不是设置的值 重要的是要记住,在代码中的任何地方引用
chatManger
都会调用getChatManger()
或setChatManger()
,包括getter或setter本身的内部。这意味着您的代码将以无限循环结束,并导致堆栈溢出错误
仔细阅读,特别是关于getter/setter以及“backing field”的部分。重要的是要记住,在代码中的任何地方引用
chatManger
都会调用getChatManger()
或setChatManger()
,包括getter或setter本身的内部。这意味着您的代码将以无限循环结束,并导致堆栈溢出错误
仔细阅读,特别是关于getter/setter以及“backing field”的部分。您在setter中调用setter。。a、 k.a.无限循环:
set(value) {
/* execute setter logic */
chatManger = value
}
在属性getter或setter中还有一个附加变量可用:字段
。这表示该属性的java
get() = field
set(value) {
field = value
}
使用常规var属性,这些getter和setter是自动生成的。
因此,这是默认行为,如果只需将值设置为字段,则不必重写getter/setter 您在setter内部调用setter。。a、 k.a.无限循环:
set(value) {
/* execute setter logic */
chatManger = value
}
在属性getter或setter中还有一个附加变量可用:字段
。这表示该属性的java
get() = field
set(value) {
field = value
}
使用常规var属性,这些getter和setter是自动生成的。
因此,这是默认行为,如果只需将值设置为字段,则不必重写getter/setter 澄清一下,您这样做是因为您想保留
数据类提供的功能(toString、equals、copy等),同时还要添加自定义setter逻辑吗?是的。我还想将数据类用于getter和setter@zsmb13@zsmb13我更新了我的问题。澄清一下,你这样做是因为你想保留数据类
提供的功能(toString、equals、copy等),同时还要添加自定义setter逻辑吗?是的。我还想将数据类用于getter和setter@zsmb13@zsmb13我必须更新我的问题。@AnkurKhandelwal“如果我将其赋值为null,那么我得到的是null而不是设置的值。”这是因为您每次都创建一个新实例,所以下一个实例将不会设置字段。Try:val chatModel=chatModel(mApplicationContext);chatModel.chatManger=chatmanager;val chatManager=chatModel.chatManager代码>。这是关于基本实例管理的,而不是关于自定义getter/setter。但也请不要重复我的最后一段:如果自定义getters setter所做的只是设置一个字段,那么就不需要自定义getters setter。那么我将如何在另一个活动中访问设置的值。在另一个活动中,我必须创建chatModel数据类的新实例。将值重新初始化为null@AnkurKhandelwal这又是一个不同的问题:“如何通过活动持久化对象”。你可能想要一个单身汉。科特林让这件事变得简单。我知道了。谢谢,@RobCo。我对他们俩都感到困惑。谢谢。抱歉打扰您。@AnkurKhandelwal“如果我将其赋值为null,那么我得到的是null而不是设置的值。”这是因为您每次都创建一个新实例,所以下一个实例将不会设置字段。Try:val chatModel=chatModel(mApplicationContext);chatModel.chatManger=chatmanager;val chatManager=chatModel.chatManager代码>。这是关于基本实例管理的,而不是关于自定义getter/setter。但也请不要重复我的最后一段:如果自定义getters setter所做的只是设置一个字段,那么就不需要自定义getters setter。那么我将如何在另一个活动中访问设置的值。在另一个活动中,我必须创建chatModel数据类的新实例。将值重新初始化为null@AnkurKhandelwal这又是一个不同的问题:“如何通过活动持久化对象”。你可能想要一个单身汉。科特林让这件事变得简单。我知道了。谢谢,@RobCo。我对他们俩都感到困惑。谢谢。对不起,打扰你了。