2017-01-13 19 views
5

Tôi đã kiểm tra các tài liệu về delegate, và tôi thấy có một loại đại biểu được cung cấp map:Kotlin, khi nào đại biểu theo bản đồ?

class MutableUser(val map: MutableMap<String, Any?>) { 
    var name: String by map 
    var age: Int  by map 
} 

Nhưng tôi không thể tìm ra sự khác biệt giữa phiên bản là những gì mà không delegate, như thế này:

class MutableUser(val map: MutableMap<String, Any?>) { 
    var name: String 
    var age: Int 
} 

Và cách sử dụng phổ biến cho đại biểu by map là gì?

Cảm ơn!

Trả lời

5

Sự khác biệt là trong ví dụ đầu tiên với ủy nhiệm, tất cả những gì bạn phải làm là đặt bản đồ vào hàm tạo và hoàn thành.

val user = MutableUser(mutableMapOf(
     "name" to "John Doe", 
     "age" to 25 
)) 

println(user.name) // Prints "John Doe" 
println(user.age) // Prints 25 

Nhưng để làm việc này giống với ví dụ thứ hai, bạn phải triển khai việc tự khởi tạo thuộc tính từ bản đồ.

class MutableUser(val map: MutableMap<String, Any?>) { 
    var name: String 
    var age: Int 

    init { 
     name = map["name"].toString() 
     age = map["age"].toString().toInt() 
    } 
} 

Một trường hợp sử dụng phổ biến sẽ triển khai trình phân tích cú pháp JSON.

+3

Một cách khác xung quanh làm việc quá - khi bạn thay đổi 'name', bản đồ được sửa đổi cho phù hợp – voddan

Các vấn đề liên quan