我有一个班级
class Address {
var address1: String? = null
}
简单的json
String jsonString = "{\"address1\":\"test\"}";
所以我想反序列化,所以我只写
Gson gson = new GsonBuilder().create();
Address address = gson.fromJson(jsonString, Address.class);
它完美无缺。
但是如果我添加自定义getter
class Address {
var address1: String? = null
get() = address1 ?: ""
}
我正在
java.lang.StackOverflowError
at ru.reksoft.okey.models.Address.getAddress1(Address.kt:8)
at ru.reksoft.okey.models.Address.getAddress1(Address.kt:8)
//and here are a lot of same lines
那么我该怎么做才能让它正常工作?
我看到的一个解决方案是删除自定义getter,但如果我真的需要它们呢?
答案 0 :(得分:3)
您应该使用field
代替:
class Address {
var address1: String? = null
get() = field ?: ""
}
问题是,在自己的setter中使用address1
会导致递归调用序列。相反,field
限定符引用backing字段。递归序列会导致您遇到StackOverflowError
。
但实际上,您还应该考虑一下您的财产感:它被声明为可以为String
,但是您不允许null
,因为您将其映射到空String
。这个地址真的被""
接受了吗?简单地做val address1: String = ""
会好得多。
答案 1 :(得分:2)
您正尝试在其getter方法中访问属性。哪个将反过来调用它的getter方法等等......这意味着它会递归调用自己直到异常。
使用field
运算符访问其值
var address1: String? = null
get() = field ?: ""
修改强>
为什么在没有任何意义的情况下允许可空性? 让Kotlin处理这个问题。只是做
var address1: String = ""