KOTLIN vs JAVA: 8 tính năng khiến bạn muốn chuyển sang KOTLIN ngay lập tức

August 27, 2020

KOTLIN vs JAVA

INTRODUCTION

Kotlin là ngôn ngữ lập trình mới được phát triển bởi JetBrains và đang được sử dụng rộng rãi trên cả backend và mobile. Đối với các lập trình viên Java, Kotlin có thể là một ngôn ngữ khá khó chịu khi tiếp cận bởi nhiều khái niệm cũng như các cú pháp (syntax) khác hẳn đàn anh Java. Tuy nhiên, từ sự kiện Google I/O 2019, Google đã chính thức đưa Kotlin làm ngôn ngữ ưu tiên khi phát triển ứng dụng Android.

TBV xin giới thiệu đến bạn đọc một số tính năng nổi bật của Kotlin 1.3 so với ngôn ngữ tiền nhiệm là Java 8. Bài viết dựa trên những cảm nhận mà một thành viên TBV có được trong quá trình phát triển ứng dụng Android với hai ngôn ngữ này.

DATA CLASS

Tương tự như POJO hay DTO trong Java, Data Class của Kotlin được dùng để định nghĩa kiểu đối tượng chỉ chứa field và không bao gồm các phương thức xử lý. Tuy nhiên, cách khai báo Data Class ngắn gọn hơn rất nhiều.

data class DataEmployee(var name: String, var age: Int)

Không chỉ là khai báo giản lược của khai báo class thường, Data Class trong Kotlin còn giúp tự động generate thêm các method cần thiết khác.

Ví dụ:

class ClassEmployee {
    var name: String = ""
    var age: Int = 0
}

Ở hai cách khai báo trên, cả DataEmployee lẫn ClassEmployee đều là Kiểu tham chiếu (reference type). Tuy nhiên, vì DataEmployee là một dạng Value Object nên Kotlin đã lén generate thêm method equals(Object o). Vì vậy, khi dùng operator ==, kết quả sẽ trả về `true` nếu tất cả các field hoàn toàn giống nhau.

DEFAULT ARGUMENTS

Chúng ta có thể khai báo giá trị mặc định cho argument khi định nghĩa hàm và class. Điều này không thể thực hiện được trong Java.

fun haveGirlFriend(val name: String = "Computer", val age: Int = 30)

LAZY LOAD

Kotlin sử dụng một cơ chế khởi tạo lazy để giảm thời gian khởi tạo một class, các biến sẽ được khởi tạo khi nó được sử dụng lần đầu tiên. Java hiện chưa có chức năng này.


val
rect: Rect by lazy { Rect(left, top, right, bottom) }

SINGLE-EXPRESSION FUNCTIONS

Trong Java, dù hàm đơn giản hay phức tạp cũng chỉ có một cú pháp định nghĩa duy nhất.

//java
int sum
(int x, int y) {
return x + y;
}

Với Kotlin, các hàm đơn giản chỉ gồm một dòng lệnh, ta có thể viết rất ngắn gọn như sau:

//kotlin
fun
sum(x: Int, y: Int) = x + y

OBJECT và COMPANION OBJECT

Global Object

Hẳn các bạn đã quen với việc sử dụng singleton trong Java qua từ khóa static. Kotlin lại hoàn toàn khác.

Kotlin không phải là ngôn ngữ hướng đối tượng tuyệt đối như Java hay C#, tất cả phải được quy về Object và Class. Thật ra, khi sử dụng static thì đã không có tính hướng đối tượng, vậy nên Kotlin đã mạnh tay bỏ luôn static. Thay vào đó, Kotlin cho phép khai báo một global object như sau:

object Helper {
    private var count = 0
    fun increasedCount(): Int = count++
}

// Use:
// println(Helper.increasedCount())

Cách khai báo này có gì khác với static của Java?
Đúng là cách sử dụng có vẻ giống nhau nhưng helper trong Kotlin mới thật sự là một object, có thể kế thừa từ nhiều interface. Ngược lại, static của Java không thể làm được điều này.

Companion Object

Trường hợp cần khai báo object/method bên trong class và sử dụng như một static member trong một class sẵn có, chúng ta cần sử dụng thêm keyword
companion
.
companion object {
    private const val NAME = "Name"
 
    fun makeIntent(context: Context) = Intent(context, Activity::class.java)
 
    @JvmStatic
    fun makeIntentV2(context: Context) = Intent(context, Activity::class.java)
}

Nếu sử dụng hàm này trong các class của Java, ta phải thêm @JvmStatic ngay trên định nghĩa hàm.

COLLECTION OPERATIONS

Tương tự lambda được hỗ trợ từ Java 8, Kotlin cung cấp những common operation hỗ trợ xử lý array (mảng) nhưng với cách viết ngắn gọn và dễ hiểu hơn. Ví dụ: filter, filterNotNull, map, flatMap, reverse, sorted....

var list = mutableListOf(3, 6, 6, 7, 9)
var result = list.filter { it % 3 == 0 }
print(result)
 
// result: [3, 6, 6, 9]

SCOPE FUNCTION

Kotlin cung cấp một số Scope Function (run, with, let, apply, also) giúp thực thi các block code theo từng object context. Các hàm này sử dụng cho các mục đích khác nhau và có áp dụng this hoặc it như đã nói ở trên. Để sử dụng đúng ta cần tham khảo sơ đồ sau đây:

kotkin-vs-java-august-2020 

Non-Null & Nullable Type

Trong Java, mãi đến Java 8 mới xuất hiện annotation @NonNull để check null tự động trước khi sử dụng. Trước đó, khi khai báo không có ? (Nullable), mặc định các kiểu dữ liệu đều là NonNull. Kotlin luôn khuyến khích sử dụng kiểu NonNull nhằm giảm thiểu lỗi NullPointerException phổ biến trong lập trình. Tuy nhiên, nếu bạn cần dùng kiểu Nullable, Kotlin vẫn hỗ trợ kèm theo các toán tử kiểm tra null đơn giản hơn Java.

var company: String? = "Techbase"
val a = company!!.length // a = 8
company = null
val b = company!!.length // throw NullPointerException
company = "Techbase"
val a = company?.length ?: -1 // a = 8
company = null
val b = company?.length ?: -1 // b = -1
company?.let {
    // do something if object is not null
}

CÓ NÊN CHUYỂN SANG KOTLIN TỪ BÂY GIỜ?

kotkin-vs-java-august-2020 
Vậy chúng ta có nên chuyển sang Kotlin từ bây giờ? (ảnh minh hoạ, nguồn: jaxenter)

Những tính năng kể trên chỉ là một phần những khác biệt (cũng có thể gọi là cải tiến đáng kể) từ Kotlin. Nhìn chung, đây là một ngôn ngữ tuyệt vời. Với cùng một ý tưởng, lượng code của Kotlin ít hơn và dễ đọc hơn rất nhiều so với Java, đặc biệt là phần định nghĩa class/function. Nói cách khác, số lượng dòng code tỉ lệ thuận với thời gian code và tỉ lệ nghịch với độ chính xác mỗi dòng code.

Một vấn đề nhỏ duy nhất là Kotlin vẫn đang giai đoạn phát triển và thay đổi. Mỗi khi có version mới sẽ có sự thay đổi syntax so với trước đó và sẽ có thêm nhiều keyword mới (lượng keyword hiện tại đã hơn nhiều so với Java). Thỉnh thoảng, bạn sẽ gặp một số task kiểu như "upgrade Kotlin 1.xxx". Không cần phải lo, vì thường thì IDEs đã giúp bạn phần lớn rồi!

Nếu bạn đang dùng ngôn ngữ Java để viết ứng dụng, hãy thử chuyển sang Kotlin và cảm nhận nhé!

Các tài liệu có thể tham khảo thêm về Kotlin

https://kotlinlang.org/docs/reference/
https://try.kotlinlang.org/
https://github.com/Kotlin
https://medium.com/@elye.project/mastering-kotlin-standard-functions-run-with-let-also-and-apply-9cd334b0ef84