Kotlin dễ ẹc – Lớp vs đối tượng: Object expression và Object declaration

Tram Ho

Khi nào dùng

  • Khi muốn tạo một đối tượng với những sự thay đổi nhỏ của lớp mà không phải khai báo tường minh lớp con của lớp đó.

Object expression

  • Tạo một đối tượng của một lớp ẩn danh kế thừa từ một hoặc nhiều kiểu khác. Đối tượng như thế được gọi là đối tượng ẩn danh (tên bên bển là anonymous object), cú pháp:

    Nếu kiểu cha có một constructor, các tham số phù hợp phải được truyền vào constructor đó. Nếu có nhiều kiểu cha được kế thừa/triển khai, chúng được ngăn cách nhau bằng dấu ,:

    Nếu chỉ cần đối tượng, không cần kiểu cha:
  • Đối tượng ẩn danh có thể được dùng như một kiểu chỉ khi trong cục bộ và các khai báo private.
  • Nếu dùng đối tượng ẩn danh như một kiểu trả về của phương thức public hoặc kiểu khai báo của các thuộc tính public thì kiểu thực sự của phương thức/ thuộc tính đó sẽ được chỉ định là kiểu của cha của đối tượng ẩn danh đó hoặc là Any nếu chưa có kiểu cha nào được khai báo trước đó. Và thành phần được thêm vào trong đối tượng ẩn danh sẽ không thể truy cập được:
  • Code trong object expression có thể truy cập các biến từ một phạm vi bao quanh object expression:

Object declaration

  • Singleton partern có thể hữu ích trong nhiều trường hợp, khai báo singleton trong Kotlin rất dễ dàng như sau:

    Khai báo DataProviderManager như trên chính là object declaration, và nó luôn có một tên được định nghĩa đi sau từ khóa object.
  • Giống khai báo một biến, một object declaration không phải là một biểu thức, và không thể dùng ở phía bên phải của một phép gán.
  • Để tham chiếu đến đối tượng, dùng trực tiếp tên của nó:
    DataProviderManager.registerDataProvider(...)
  • Các đối tượng này có thể có kiểu cha
  • Object daclaration không thể là local (ví dụ như là ở trong một phương thức), nhưng nó có thể được khai báo trong object daclaration khác hoặc lớp không phải là lớp inner.

Companion object

  • Object declaration bên trong một lớp có thể được đánh dấu bằng từ khóa companion:
  • Các thành phần của companion object có thể được gọi băng cách tên của lớp:
    val instance = MyClass.create()
  • Có thẻ không cần khai báo tên của companion object, trong trường hợp này tên Companion sẽ được dùng:
  • Mặc dù các thành phần của companion object có vẻ giống như thành phần static trong các ngôn ngữ khác nhưng tại runtime chúng vẫn và instance của một object thực sự và có thể thực hiện một số việc, ví dụ như triển khai interface:
  • Tuy nhiên các thành phần của companion object có thể được tạo ra là các phương thức static và các trường static nếu dùng JvmStatic annotation.

Sự khác biệt

  • Một số điểm khác biệt quan trọng giữa object expressionobject declaration:
  1. Object expression được thực hiện và khởi tạo ngay khi nó được dùng.
  2. Object declaration được khởi tạo muộn khi mà đối tượng được truy cập lần đầu.
  3. Companion object được khởi tạo khi lớp tương ứng được tải lên,
Chia sẻ bài viết ngay

Nguồn bài viết : Viblo