Tìm hiểu về extension trong kotlin

I, Extension

  • Trong kotlin, extension là component cho phép chúng ta mở rộng 1 class sẵn có mà không cần phải kế thừa class đó.
  • Chúng ta có hai loại extension:
    • Extension function: định nghĩa function mới cho 1 class sẵn có.
    • Extension property: định nghĩa property mới cho 1 class sẵn có.

II, Extension function

  • Để tạo ra 1 extension function, chúng ta cần phải đặt receiver type trước tên của function. Hãy xem ví dụ dưới đây để hiểu rõ hơn.
  • Ví dụ 1: tạo extension function getWelcomeMessage() với receiver type là Int
1
2
3
4
5
6
7
8
9
fun Int.getWelcomeMessage(): String = if (this == 0) {
"No message"
} else {
"Hello, everyone"
}

// Then we can use
1.getWelcomeMessage() // This returns `Hello, everyone`
0.getWelcomeMessage() // This returns `No message`
  • Keyword this đại diện cho object của receiver type.

  • Extension function cũng có thể nhận nullable receiver type. Trong trường hợp đó chúng ta có thể check this == null để thực hiện 1 công việc nào đó.

  • Ví dụ 2: tạo extension fuction toString() với null receiver type Any?

1
2
3
4
5
6
fun Any?.toString(): String {
if (this == null) return "null"
// after the null check, 'this' is autocast to a non-null type, so the toString() below
// resolves to the member function of the Any class
return toString()
}
  • Extension function cũng có thể kết hợp với generic.

II, Extension property

  • Chúng ta tạo ra extension property tương tự như extension function.
  • Kotlin không cho phép khởi tạo giá trị cho extenstion property.
  • Ví dụ 3:
1
2
val <T> List<T>.lastIndex: Int
get() = size - 1

III, Tại sao extension lại tối ưu ?

  • Chúng ta đều biết Java và Kotlin đều chạy trên JVM và Kotlin class có thể compile sang Java class.
  • Một extension function (property) khi được compile sang java code thì đều là những static function.
  • Do đó, extension function giúp tối ưu về performance.
  • Ví dụ 4: kotlin compiler sẽ compile extension ở ví dụ 1 và ví dụ 3
1
2
3
4
5
6
7
8
9
@NotNull
public static final String getWelcomeMessage(int $this$getWelcomeMessage) {
return $this$getWelcomeMessage == 0 ? "No title" : "Hello, everyone";
}

public static final int getLastIndex(@NotNull List $this$lastIndex) {
Intrinsics.checkParameterIsNotNull($this$lastIndex, "$this$lastIndex");
return $this$lastIndex.size() - 1;
}