2017-01-26 7 views
5

Backend zwraca wartość null Int? Jak napisać wartość zerowalną?Wpisz wartość parametru wartościowania w kotlinie

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 
    } 
} 

Teraz mam rozwiązanie:

dest.writeInt(value?: -1) 

a następnie sprawdzić na -1

lub napisać Int jak ciąg, a następnie użyć wartości ...

ale myślę, że to brzydki i zły.

ROZWIĄZANE! Moja odpowiedź:

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

nie 'dest.writeInt (wartość !!)' działa? O ile dobrze pamiętam, Android nie przejmuje się, jeśli przekażesz wartość "null" do Parcel. –

+0

!! - Wystąpił wyjątek null i awaria! – Yvgen

+1

Jeśli znalazłeś odpowiedź na swoje pytanie, powinieneś opublikować ją jako odpowiedź i zaakceptować. – Bryan

Odpowiedz

3

rozstrzygane przez:

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

To w dużej mierze zależy od tego, co jest semantyka null jako wartości nieruchomości pustych. To może oznaczać:

  • Jeśli value jest null to jest nieobecny i nie powinien być napisany w ogóle:

    value?.let { writeInt(it) } 
    

    Oczywiście, odbiornik Parcel powinny być w stanie określić, czy należy to czytać wartość lub nie, powinno to wynikać z wartości zapisanych wcześniej.

  • value jest przez niektórych kodu, a to jest błąd jeśli jest zerowa w miejscu, gdzie powinno być napisane:

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

    Również w tym przypadku, należy rozważyć użycie lateinit var zamiast mienia wartości pustych .

  • Niektóre Domyślna wartość powinna być stosowana zamiast value:

    writeInt(value ?: someDefaultValue()) 
    

    Z Parcel, to ma sens, bo w przeciwnym razie, jeśli wartość wynosi brakuje, trzeba podać fakt gdzieś indziej.

  • ... (null może faktycznie oznaczać wiele rzeczy)

Również this answer pokazuje wiele idiomatyczne sposoby radzenia sobie z wartości pustych, a może się okazać, niektóre z nich użyteczny.

+0

"Jeśli wartość jest zerowa, to jest ona nieobecna i nie powinna być w ogóle napisana" Tak, ale wciąż musimy wiedzieć o tej nieobecności, gdy się ją unormuje, więc * coś * musi być napisane. –

1

Zastanów się, co Google Play korzystanie bezpiecznie zebrać pustych ciągów:

String NULL = "SAFE_PARCELABLE_NULL_STRING"; 

ten technicznie nie jest łańcuchem pustym, zespół zdecydował, że semantycznie Ten ciąg jest równy null.

Używamy podobnych technik podczas pracy z listami. Najpierw my writeInt o długości listy. Może to być -1 oznaczające, że lista ma wartość zerową.

To, czy można użyć numeru -1, aby reprezentować brak liczby całkowitej, zależy od schematu. W twoim przypadku użycia jest -1 prawidłową wartość? Jeśli tak, musisz znaleźć inną wartość, która będzie reprezentować twoją wartość zerową, taką jak Int.MIN lub Int.MAX.

Jeśli wszystkie te wartości są w poprawnym zakresie, należy użyć innej wartości tak:

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

Nie zapomnieć o żadnym z tych przypadków, gdy unmarshalling!

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