Một trong những điều tuyệt vời của Kotlin, giúp nó có được sự phát triển mạnh mẽ như bây giờ là khả năng tương thích tuyệt vời với java. Thử tưởng tượng bạn đang có một dự án cồng kềnh được viết bằng java, và việc đập đi để làm lại bằng kotlin là một điều hoàn toàn không khả thi, thay vì vậy, chúng ta có thể tích hợp những chức năng mới bằng kotlin, song song với việc sử dụng những chức năng cũ được viết bằng java, hoặc cũng có những trường hợp việc sử dụng kotlin có thể không giải quyết được vấn đề của dự án, thì phương án dùng code java thay thế hoàn toàn rất đơn giản.

Ngay từ khi kotlin ra đời thì bộ công cụ converter thần thánh trên đã chứng minh sự khả chuyển giữa kotlin và java, tuy nhiên trong đa số trường hợp thì việc sử dụng chức năng này cũng không được tốt cho lắm, đặc biệt là với những khối code có logic phức tạp thì tốt hơn hết là chúng ta nên convert bằng tay.

Sau đây mình sẽ giới thiệu một số trường hợp thường gặp khi chúng ta một sử dụng song song 2 ngôn ngữ này trong dự án.

Calling Kotlin from Java: Package-level functions

Kotlin cho phép một phương thức độc lập, không cần phải khai báo trong một class, tuy nhiên Java lại không cho phép điều đó, vậy làm sao để gọi được phương thức đó trong code Java, thử tưởng chúng ta có một hàm showMessage được khai báo trong file Kotlin kotlin.kt (các file Kotlin sẽ có đuôi .kt)

fun showMessage(message: String) {
    Log.d("Kotlin", message)
}

Để gọi được phương thức này trong file Java code, chúng ta sẽ sử dụng một class trung gian, đó là UtilsKt, và gọi hàm trên như một hàm static

UtilsKt.showMessage("message)

Extension functions

Extension fuctions là một tính năng thú vị của Kotlin, cho phép cũng ta dễ dàng mở rộng bất cứ đối tượng nào mình muốn, vậy nó sẽ trông như thế nào khi sử dụng trong java, thử tưởng tượng chúng ta có một hàm extension

fun View.visible() {
    this.visibility = View.VISIBLE
}

Hàm này cho phép chúng ta set thuộc tính visibility của bất kì view nào là VISIBLE, để gọi được trong java, chúng ta cũng phải gọi thông qua UtilsKt

UtilsKt.visible(view)

Thay vì gọi trực tiếp như trong Kotlin, đối tượng sử dụng thuộc tính này sẽ được truyền vào như là một parameter.

Sealed classes

Làm thế nào để gọi được một sealed class trong java được cơ chứ? ví dụ chúng ta có một class Kotlin:

sealed class Filter {
    object None : Filter()
    data class ByType(val type: Type) : Filter()
    data class ByFormat(val format: Format) : Filter()
}

rõ ràng là chúng ta không thể gọi nó trong java kiểu như

public void filter(Filter filter) {
    switch (filter) {
        ...
    }
}

swich không java chỉ chấp nhận một số kiểu nhất định, và trong tất cả các trường hợp thì java xem một sealed class chỉ như một class thông thường, tuy nhiên chúng ta có thể thử cách sau:

if (filter instanceof Filter.None) {
    Log.d(TAG, "Nothing to filter");
} else if (filter instanceof Filter.ByType) {
    Filter.ByType type = (Filter.ByType) filter;
    Log.d(TAG, "Type is: " + type.getType().toString());
} else if (filter instanceof Filter.ByFormat) {
    Filter.ByFormat format = ((Filter.ByFormat) filter);
    Log.d(TAG, "Format is: " + format.getFormat());
}

Thực sự là trong trường hợp này việc sử dụng việc gọi hàm của sealed class trong java vẫn còn thể làm được mặc dù không còn nhiều ý nghĩa nữa.

Kết

Tất nhiên còn rất nhiều trường hợp nữa ngoài những trường hợp mình đã nêu trên, và tất nhiên chúng ta đều có cách để sử dụng được chúng, khả năng khả chuyển của kotlin và java là một lý do tuyệt vời để chúng ta bắt tay vào code những dòng kotlin đầu tiên cho dự án của mình. Have fun !