今天在学习Kotlin的时候遇到一个关于getter的坑,在此记录一下希望以后的人不要再踩^_^ 先上代码再说(等等,谁是代码。。):
data class User(var name: String = "", var age: Int = 0) {
var banJi: String = ""
get() = "班级:" + banJi
fun getXxxx(): String {
return "$name is $age age";
}
}
这是一个学习资料里data类型的例子,我多加了一个属性banji,这个类看官发现有什么问题吗?应该是没有问题的,我开始的时候时这么认为的。语法检查是没有问题的,编译也没有问题,可是运行的时候就会有问题了: 调用时是这样的
val chun = User("xxxx", 30)
chun.banJi = "二(3)"
Log.d("idebug", "chun txt: " + chun.getXxxx() + " " + chun.banJi)
出现的问题如下:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.jaleke.kotlintext, PID: 7076
java.lang.StackOverflowError: stack size 8MB
at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:148)
at java.lang.StringBuilder.append(StringBuilder.java:216)
at com.jaleke.kotlintext.aab.User.getBanJi(User.kt:11)
at com.jaleke.kotlintext.aab.User.getBanJi(User.kt:11)
at com.jaleke.kotlintext.aab.User.getBanJi(User.kt:11)
at com.jaleke.kotlintext.aab.User.getBanJi(User.kt:11)
。。。。
长度超出了8M,这是怎么回事呢? 通过调式发现程序会无限循环调用get方法,这就郁闷了
var banJi: String
get() = "班级:" + banJi
set(value) {
banJi = value
}
这样用set的时候也会有无限循环调用set方法,好郁闷哦 。。。。 在度娘上找了好久,终于找到答案,正确的写法应该是这样的:
var banJi: String? = null
get() = "班级:" + field
set(value) {
field = value
}
用field,属性的get和set方法里面使用了一个field,它是一个自动的返回字段,代表的就是属性。 field只有在访问的时候才会产生,其他时候是不会产生的。
感谢以下地址的作者解决了我的问题 Kotlin学习笔记——属性和字段