test2
в конечном итоге вызовет получателя.Вы можете посмотреть на полученный Java-код для справки.
В пользовательских методах получения и установки вместо него используется field
.Таким образом, правильный код будет:
class Test(var test1: String? = "") {
var test2: String?
get() = if (StringUtils.isNotEmpty(field)) field else test1
set(test2Val) {
field = test2Val
}
}
Примечание: это вызывает вторую проблему.Вы не инициализировали переменную, которую вы должны делать с vars.Если у вас есть val
и пользовательский метод получения, который возвращает что-то еще (например, val x = ... get() = someOtherVar
, это не выдает ошибку компилятора).Это не относится к var
с, хотя.Однако, в вашем случае, использования = null
(или альтернативно = ""
) должно быть достаточно.
Но так как вы сказали, что получаете StackOverflowErrors, а не ошибку, связанную с отсутствием инициализации, я предполагаю, что вы действительно инициализируете его, но просто не включили его в MCVE.Но если вы этого не сделали, это стоит отметить.
Кроме того, у Kotlin есть такие методы, как isNotEmpty()
и isNotBlank()
, которые заменяют необходимость в StringUtils.isNotEmpty()
, и он называется как field.isNotEmpty()
.Обратите внимание, что здесь вы хотите сделать if(field?.isNotEmpty() == true) ...
, потому что в итоге вы получите логическое значение Nullable.Это также означает, что он возвращает test1, если поле пустое или пустое.Вы также можете добавить isNotBlank
, если захотите.
И вам не нужно объявлять сеттеры вручную, если они делают то же самое, что и сгенерированный.Если вы сделаете это, IDE, например IntelliJ, также предупредит вас и предложит удалить его.На самом деле не имеет значения, объявляете ли вы это вручную или нет, если это установщик по умолчанию, но это помогает вам написать немного меньше кода.