Записать в значение парного нуля в kotlin

Backend возвращает nullable Int? Как я должен писать значение NULL?

date class Foo (var value: Int?){ constructor(source: Parcel) : this( source.readInt() ) override fun writeToParcel(dest: Parcel, flags: Int) { dest.writeInt(value) // doesn't compile - writeInt expect no null value } } 

Теперь я получил решение:

 dest.writeInt(value?: -1) 

И затем проверьте на -1

или написать Int как строку, а затем использовать значение …

но я думаю, что это уродливо и неправильно.

ПОСТАНОВИЛИ! Мой ответ:

 source.readValue(Int::class.java.classLoader) as Int?, dest.writeValue(value) 

Решено:

 source.readValue(Int::class.java.classLoader) as Int?, dest.writeValue(value) 

Это во многом зависит от того, что является семантикой null как значения свойства nullable. Это может означать:

  • Если value равно null, оно отсутствует и не должно быть написано вообще:

     value?.let { writeInt(it) } 

    Разумеется, приемник Parcel должен иметь возможность определить, следует ли читать значение или нет, это должно быть ясно из значений, написанных ранее.

  • value предоставляется некоторым кодом, и это ошибка, если она равна нулю в точке, где она должна быть записана:

     check(value != null) { "value should be not null at the point it's wriiten" } writeInt(value!!) 

    Кроме того, в этом случае рассмотрите использование lateinit var вместо свойства lateinit var .

  • Вместо значения следует использовать некоторое значение по умолчанию:

     writeInt(value ?: someDefaultValue()) 

    С помощью Parcel это имеет смысл, потому что в противном случае, если значение отсутствует, вы должны указать факт в другом месте.

  • … ( null может фактически означать много вещей)

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

Подумайте, какие услуги Google Play используют для безопасного вывода нулевых строк:

 String NULL = "SAFE_PARCELABLE_NULL_STRING"; 

Это технически не является нулевым String, команда решила, что семантически эта String равна нулю.

Мы используем аналогичные методы при работе со списками. Сначала мы writeInt с длиной списка. Это может быть -1 чтобы обозначить список равным null.

Можно ли использовать -1 для представления отсутствия целого, зависит от вашей схемы. В вашем случае использования -1 допустимое значение? Если это так, вы должны найти другое значение для представления своего нулевого значения, такого как Int.MIN или Int.MAX .

Если все эти значения находятся в допустимом диапазоне, используйте другое значение, например:

 val hasValue: Boolean = value != null val hasValueByte: Byte = if (value != null) 1 else 0 dest.writeByte(hasValueByte) if (hasValue) dest.writeInt(value) 

Не забывайте об одном из этих случаев, когда вы не разбираетесь!

 val parcelHasValueByte = source.readByte() val parcelHasValue = parcelHasValueByte != 0 if (parcelHasValue) { value = source.readInt() } else { value = null }