2017-01-26 15 views
5

Trả về phụ trợ có thể vô hiệu hóa Int? Tôi nên viết giá trị rỗng như thế nào?Viết vào giá trị vô giá trị parcer trong kotlin

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

Bây giờ tôi có giải pháp:

dest.writeInt(value?: -1) 

Và sau đó kiểm tra đến -1

hoặc viết Int như chuỗi và sau đó sử dụng giá trị của ...

nhưng tôi nghĩ rằng đó là xấu và sai.

GIẢI QUYẾT! Câu trả lời của tôi:

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

Sẽ không phải 'dest.writeInt (giá trị !!) 'làm việc? Theo tôi nhớ, Android không quan tâm nếu bạn chuyển giá trị 'null' vào Parcel. –

+0

!! - xảy ra nullPointerexception và sự cố! – Yvgen

+1

Nếu bạn tìm thấy câu trả lời cho câu hỏi của mình, bạn nên đăng câu trả lời và chấp nhận câu trả lời. – Bryan

Trả lời

3

Resolved bởi:

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

này phần lớn phụ thuộc vào ngữ nghĩa của null như một giá trị của tài sản nullable của bạn là gì. Nó có thể có nghĩa là:

  • Nếu value là null thì nó là vắng mặt và không nên được viết ở tất cả:

    value?.let { writeInt(it) } 
    

    Tất nhiên, Parcel nhận sẽ có thể xác định xem nó nên đọc giá trị hay không, điều này nên được rõ ràng từ các giá trị được viết trước đó.

  • value được cung cấp bởi một số mã, và nó là một lỗi nếu nó là null tại điểm mà nó nên được viết:

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

    Ngoài ra, trong trường hợp này, hãy xem xét sử dụng lateinit var thay vì tài sản nullable .

  • Một số giá trị mặc định nên được sử dụng thay vì value:

    writeInt(value ?: someDefaultValue()) 
    

    Với Parcel, điều này không có ý nghĩa, bởi vì nếu không, nếu giá trị là mất tích, bạn phải xác định thực tế ở một nơi khác.

  • ... (null thực sự có thể có nhiều nghĩa)

Ngoài ra, this answer cho thấy nhiều cách thành ngữ đối phó với các giá trị nullable, và bạn có thể tìm thấy một số trong số họ có ích.

+0

"Nếu giá trị là null thì nó vắng mặt và không nên viết ở tất cả" Có, nhưng chúng tôi vẫn cần phải biết về sự vắng mặt này khi unmarshalling vì vậy * cái gì đó * đã được viết. –

1

Hãy xem xét những gì Google Play dịch vụ sử dụng để sắp xếp một cách an toàn Strings null:

String NULL = "SAFE_PARCELABLE_NULL_STRING"; 

này về mặt kỹ thuật không phải là một chuỗi null, nhóm nghiên cứu đã quyết định rằng ngữ nghĩa Chuỗi này là tương đương với giá trị null.

Chúng tôi sử dụng các kỹ thuật tương tự khi làm việc với danh sách. Đầu tiên, chúng tôi writeInt với độ dài của danh sách. Đây có thể là -1 để biểu thị danh sách là rỗng.

Cho dù bạn có thể sử dụng -1 để biểu thị sự vắng mặt của một số nguyên phụ thuộc vào lược đồ của bạn. Trong trường hợp sử dụng của bạn là -1 một giá trị hợp lệ? Nếu có, bạn phải tìm một giá trị khác để biểu thị giá trị rỗng của bạn chẳng hạn như Int.MIN hoặc Int.MAX.

Nếu tất cả những giá trị trong phạm vi hợp lệ, sử dụng giá trị khác như vậy:

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

Đừng quên về một trong những trường hợp khi unmarshalling!

val parcelHasValueByte = source.readByte() 
val parcelHasValue = parcelHasValueByte != 0 
if (parcelHasValue) { 
    value = source.readInt() 
} else { 
    value = null 
} 
Các vấn đề liên quan