2017-05-26 15 views
9

Tôi rất bối rối cả về ngoại hình và công trình khá giống nhau. Tôi nên đi đâu?Sự khác biệt giữa Delegates.notNull và lateinit Kotlin

private var mMediaController by Delegates.notNull<MediaControllerCompat>() 

hoặc

lateinit private var mMediaController: MediaControllerCompat 

Cách sử dụng:

@Subscribe 
    fun connectToSession(token: MediaSessionCompat.Token) { 
     mMediaController = MediaControllerCompat(activity, token) 
     mMediaController.registerCallback(mMediaControllerCallback) 
    } 
+0

câu hỏi này không được đánh dấu khép kín, là có cái gì khác cần vượt ra ngoài câu trả lời hiện tại? –

Trả lời

12

Hai mô hình tương tự, và một xảy ra trước kia. Delegates.notNull() (api reference) được dựa trên delegated properties và là bản gốc và sau đó là lateinit (Late Initialized Properties). Không bao gồm tất cả các trường hợp sử dụng có thể và không nên sử dụng trừ khi bạn có thể kiểm soát vòng đời của lớp và biết chắc chắn rằng chúng sẽ được khởi tạo trước khi được sử dụng.

Nếu trường sao lưu có thể được đặt trực tiếp hoặc thư viện của bạn không thể làm việc với đại biểu thì bạn nên sử dụng lateinit và thường là mặc định cho hầu hết mọi người khi sử dụng với tiêm phụ thuộc. From the docs:

Thông thường, các thuộc tính được khai báo là có loại không rỗng phải được khởi tạo trong hàm tạo. Tuy nhiên, khá thường xuyên điều này là không thuận tiện. Ví dụ, các thuộc tính có thể được khởi tạo thông qua việc tiêm phụ thuộc, hoặc trong phương thức thiết lập của một phép thử đơn vị. Trong trường hợp này, bạn không thể cung cấp một bộ khởi tạo không null trong hàm dựng, nhưng bạn vẫn muốn tránh kiểm tra rỗng khi tham chiếu thuộc tính bên trong phần thân của một lớp.

Nếu loại bạn đang sử dụng không được hỗ trợ bởi lateinit (không hỗ trợ loại nguyên thủy), bạn sau đó buộc phải sử dụng đại biểu.

Công cụ sửa đổi (cuối cùng) chỉ có thể được sử dụng trên các thuộc tính var được khai báo bên trong thân của một lớp (không phải trong hàm khởi tạo chính), và chỉ khi thuộc tính không có trình khởi động hoặc thiết lập tùy chỉnh. Loại thuộc tính phải không phải là rỗng và không phải là loại nguyên thủy.

Bạn cũng có thể muốn đọc chủ đề thảo luận "Improving lateinit".

9
  • notNull tạo đối tượng bổ sung cho mỗi thuộc tính.

  • Đối tượng nhỏ, nhưng nếu bạn có nhiều thuộc tính, nó có thể là đáng kể cho bạn.

  • Bạn không thể sử dụng đại biểu không đầy đủ với các công cụ phun bên ngoài mà truyền trực tiếp đến các trường Java;

  • Bạn không thể tạo thuộc tính trễ của loại nguyên thủy (Int, Long, v.v.).

  • lateinit rẻ hơn, nhưng bạn chỉ có thể sử dụng đại biểu khi thuộc tính của bạn có loại nguyên thủy.

Nguồn: https://discuss.kotlinlang.org/t/notnull-delegate-vs-lateinit/1923/2

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