+2

Có thể bạn thừa biết - sức mạnh của functions trong Kotlin

1. Overloading functions

Chúng ta bắt đầu với những thứ rất cơ bản đó là "overloading functions". Tôi phải tạo ra một overloaded function có thể lấy nhiều nhất là 6 và ít nhất là 2 tham số. Nếu sử dụng java thì với yêu cầu này chúng tôi phải tạo ra đến 6 phương thức khác nhau lặp đi lặp lại mà dường như rất không thực tế. Nhưng với Kotlin, chúng ta được biết đến cái gọi là "default values ", cái mà sẽ tự động xử lý vấn đề này cho chúng ta. Ví dụ như là:

fun createStudent(name: String,
                  course: String,
                  age: Int = 0,
                  address: String = "",
                  email: String = "",
                  linkedIn: String = ""): Student = 
Student(name, course, age, address, email, linkedIn)

Sẽ cho phép chúng ta gọi những phương thức như là:

createStudent(“name”,”Course”), 
createStudent(“name”,”Course”,22), createStudent(“name”,”Course”,address=”Address”, email=”[email protected]”),
...

Nếu chúng ta chỉ muốn chọn các tham số trong khi gọi functions cái mà không được order, chúng ta có pas các tham số như các tham số đã được đăt tên, cái mà cho phép Kotlin tự động suy luận ra đúng cái tham số cho chúng ta. Cũng cần lưu ý rằng việc xác định tên cho một đối số cụ thể sẽ dẫn đến việc chúng ta xác định tên cho tất cả các đối số sau đó để tránh nhầm lẫn.

Chú ý: Khi gọi các phương thức từ file java, overloading này sẽ không làm việc ngoài box. Chúng ta cần chú thích cho các method với các chú thích cụ thể @JvmOverloads, cái mà sẽ tạo ra các methods overloaded trong java cho chúng ta. Bạn cũng có thể kiểm tra bytecode được dịch ngược để xem những gì mà tất cả các methods đã tạo ra cho chúng ta khi sử dụng @JvmOverloads

2. Static Utility classes

Tiếp đến, chúng ta có nhưng thứ rất phổ biến đó là static Utility classes Các phương thức thông thường, cái mà không được cụ thể trong bất kì một android class đặc biệt nào kết thúc trong static Utility class để có thể được truy cập một cách thuận tiện. Với Kotlin, chúng ta có những thứ được biết đến như là top-level functionstop-level properties. Thay vì tạo ra các lớpvô nghĩa bao bọc các phương thức này, chúng ta có thể chỉ đơn giản thiết lập các phương thức trực tiếp bên ngoài lớp cha mẹ của chúng ta. Như vậy, phương thức có khả năng được truy cập vào từ bất cứ đâu trong package của chúng ta.

package com.dagger.kotlin

import java.util.*

//Since the function's body contains a single expression, we need not use curly braces here
fun createRandomNumber() = Random().nextInt()

//This works for properties as well
val MY_API_KEY : String = "API_KEY"

data class Student(){
  ...
}

Chú ý, tên của static class này phụ thuộc vào class gốc (ban đầu)

3. Extension functions

Cuối cùng nhưng không phải ít nhất, đó chinhs là extension functions! Chúng ta hãy nghĩ đến rất nhiều những trường hợp cơ bản như: Toast Sẽ không được đẹp nếu chúng ta có cái gì đó như thế này

“I’m a long toast”.longToast(context)

Thay vì gọi Toast chúng ta yêu và biết, nhiều lần nữa

Toast.makeText(context,”I’m a long toast”,Toast.LENGTH_LONG).show()

Với Kotlin, điều này là hoàn toàn có thể, nhờ các Extension Functions tuyệt vời mà có thể được gọi bởi các đối tượng của một lớp cụ thể, mà không được định nghĩa trong lớp đó. Làm thế nào chúng ta có thể làm điều này? Vâng, khá dễ dàng!

package kotlindemo

import android.content.Context
import android.widget.Toast

fun Any.shortToast(ctx: Context) = Toast.makeText(ctx, this.toString(), Toast.LENGTH_SHORT).show()

Chúng ta hãy nhìn vào các thành phần liên quan ở đây:

  • Any.shortToast() : Ở đây, Bất kỳ là Receiver Type, là loại mà extension funnction được định nghĩa. Trong Kotlin, Any là anologus đến Object class trong Java, Any.shortToast () có nghĩa là phương pháp shortToast của tôi có thể được gọi trên mọi đối tượng có sẵn.
  • this.toString() : this ở đây là Receiver Object, i.e. một instance của Receiver Type. Vì vậy, khi tôi viết một cái gì đó như thế này:
4.shortToast(context)

Ở đây, Receiver Type ở đây là Int, trong khi đối tượng Receiver là 4.

Khá hay, phải không nào !? Tuy nhiên, trước khi bạn tiếp tục và chấp nhận điều này như là phép thuật Voodoo, chúng ta cần phải nhận ra rằng phía dưới hood, đây là mã Plain Java chạy trên điện thoại của chúng ta. Nó là một bài thực hành tốt, làm thế nào để việc làm này chính xác.

Xem xét Java Bytecode được biên dịch, chúng ta có thể thấy rằng một lớp Java mới có tên ExtensionFuncKt.java được tạo ra có một static method.

Phương thức này cũng có trong một Receiver và một Context và hiển thị Toast phù hợp.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.