Get in touch
or send us a question?
CONTACT

Extension function – Kotlin

Decorator pattern cho phép người dùng thêm chức năng mới vào một đối tượng hiện có mà không làm thay đổi cấu trúc của nó. Loại design pattern này dùng để có các tính năng bổ sung được thêm vào đối tượng ban đầu.

Kotlin cung cấp khả năng mở rộng một class với chức năng mới mà không cần phải kế thừa từ class đó, sử dụng tương tự các mẫu thiết kế như Decorator. Điều này được thực hiện thông qua các khai báo đặc biệt được gọi là Extension.  

Ví dụ: Bạn có thể viết các hàm mới cho một class từ thư viện của bên thứ ba mà bạn không thể sửa đổi, hay không muốn làm ảnh hưởng tới class cũ. Các hàm như vậy có sẵn để gọi theo cách thông thường như thể chúng là các phương thức của lớp ban đầu. Cơ chế này được gọi là extension function . Ngoài ra còn có extension properties cho phép bạn xác định các thuộc tính mới cho các lớp hiện có.

Extension functions

Trong function extension, Kotlin cho phép định nghĩa một phương thức bên ngoài lớp chính (main class). Trong ví dụ sau, chúng ta sẽ thấy cách extension được implement ở functional level.

Class các loại đồ uống được khỏi tạo sẵn.

Ở đây chúng ta có 2 loại đồ uống Espresso và Mocha đã được tạo sẵn. Nhưng khi người dùng muốn dùng thêm sữa, topping … chúng ta cần tính lại giá. Để không làm thay đổi các class được tạo sẵn hay kế thừa chúng, ta có thể làm như sau:

Sử dụng function extension để custom class ở ngay tại nơi cần sử dụng.

Sau khi viết các extension function => chúng ta chỉ cần gọi các function này bằng kí hiệu chấm(.) như các function thông thường.

Kết quả được in ra như sau.

Vì thế, từ ví dụ bên trên, chúng ta đã quan sát thấy các function mới được add vào hoạt động giống như function static bởi vì chúng ta đang gọi chúng bằng Classname.fun_name. Những lợi ích chính của extention function là:

  • Giảm lượng code.
  • Code trở lên dễ hiểu hơn và dễ dàng đọc hơn.
  • Chúng ta có thể dễ dàng modify các class sẵn có hoặc bị đóng gói.

Nguồn tham khảo : https://kotlinlang.org/docs/extensions.html#extensions-are-resolved-statically