关于Kotlin的getter的坑

今天在学习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学习笔记——属性和字段

猜你喜欢

转载自my.oschina.net/u/214986/blog/908755