Почему классы данных Kotlin могут иметь значения NULL в ненулевых полях с Gson? - PullRequest
0 голосов
/ 16 октября 2018

В Kotlin вы можете создать data class:

data class CountriesResponse(
    val count: Int,
    val countries: List<Country>,
    val error: String)

Затем вы можете использовать его для анализа JSON, например, "{n: 10}".В этом случае у вас будет объект val countries: CountriesResponse, полученный от Retrofit, Fuel или Gson, который содержит следующие значения: count = 0, countries = null, error = null.

In Kotlin + Gson - Howчтобы получить пустой список значений NULL для класса данных , вы можете увидеть другой пример.

Когда вы позже попытаетесь использовать countries, вы получите исключение здесь: val size = countries.countries.size: "kotlin.TypeCastException:Нуль не может быть приведен к непустому типу kotlin.Int ".Если вы пишете код и используете ? при доступе к этим полям, Android Studio выделит ?. и выдаст предупреждение: Unnecessary safe call on a non-null receiver of type List<Country>.

Итак, должны ли мы использовать ? в классах данных?Почему приложение может установить null на ненулевые переменные во время выполнения?

1 Ответ

0 голосов
/ 16 октября 2018

Это происходит потому, что Gson использует небезопасный (как в java.misc.Unsafe) механизм конструирования экземпляров для создания экземпляров классов, минуя их конструкторы, а затем напрямую устанавливает их поля.

См. Этот раздел вопросов и ответов для некоторых исследований: десериализация Gson с Kotlin, блок инициализатора не называется .

. Как следствие, Gson игнорирует как логику построения, так и инварианты состояния класса, поэтому не рекомендуется использовать его для сложных классов, которыеможет быть затронуто этим.Он также игнорирует проверки значений в установщиках.

Рассмотрим решение для сериализации с поддержкой Kotlin, такое как Джексон (упомянутое в приведенных выше вопросах и ответах) или kotlinx.serialization.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...