Хорошо, у меня есть класс
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
Так что я могу сделать, чтобы он работал правильно?
Единственное решение, которое я вижу, – это удаление пользовательских геттеров вообще, но что, если они мне действительно нужны?
Вместо этого вы должны работать с field
:
class Address { var address1: String? = null get() = field ?: "" }
Проблема состоит в том, что использование address1
внутри своего собственного сеттера приводит к рекурсивной последовательности вызовов. Вместо этого field
квалификатор относится к полю резервного копирования. Рекурсивная последовательность приводит к столкновению StackOverflowError
.
Но на самом деле, вы также должны думать о смысле вашей собственности: он объявлен как NULL String
, но вы не допускаете null
так как вы сопоставляете его с пустой String
. Действительно ли ""
принят» для адреса? Было бы намного проще просто сделать val address1: String = ""
.
Вы пытаетесь получить доступ к свойству в методе getter. Это, в свою очередь, вызовет его метод getter и т. Д. … Это означает, что он вызывает рекурсивно до исключения.
использовать оператор field
для доступа к его значению
var address1: String? = null get() = field ?: ""
РЕДАКТИРОВАТЬ
Зачем допускать недействительность, если это не имеет никакого смысла? Пусть Котлин позаботится об этом. Просто делать
var address1: String = ""