Tại sự kiện Google I/O 2017 diễn ra ngày 17/5/2017, California, Mỹ, Google đã tuyên bố ngôn ngữ lập trình mới Kotlin sẽ trở thành ngôn ngữ được hỗ trợ chính thức của Android bên cạnh người tiền nhiệm Java.
Kotlin ra đời và phát triển một cách nhanh chóng, Kotlin có thế mạnh gì? Tại sao Google lại hỗ trợ Kotlin mà không phải là một ngôn ngữ nào khác? Là một lập trình viên bạn đã biết gì về ngôn ngữ lập trình này?
Kotlin là gì?
Kotlin là một ngôn ngữ lập trình được phát triển bởi JetBrains (cha đẻ của IntelliJ IDEA), xuất hiện lần đầu tiên vào năm 2011 khi JetBrains công bố một dự án mới có tên là “Kotlin”. Giống như Java hay Swift, Kotlin là một ngôn ngữ mã nguồn mở.
Sau khi được công bố tại Hội nghị phát triển Google I/O 2017, cho đến thời điểm này, một số công ty lớn như Uber, Nexflix, Trello, Pinterest,… hay các nhà phát triển như Expedia, Pinterest, Square và Flipboard,… đã và đang sử dụng Kotlin để phát triển nền tảng ứng dụng của mình. Có thể thấy, Kotlin ra đời không những giúp các lập trình viên Andoid sử dụng Java có cơ hội học hỏi, nâng cấp sản phẩm mà còn có thêm một lựa chọn ngôn ngữ cho hệ điều hành này.
Những vấn đề của Java
Cho dù Java là một trong những ngôn ngữ lập trình được sử dụng rộng rãi và là ngôn ngữ chính thức để phát triển Android, nhưng có nhiều lý do khiến Java có thể không phải lúc nào cũng là sự lựa chọn tốt nhất cho một dự án Android. Vấn đề lớn nhất ở đây đó là Java không phải là một ngôn ngữ hiện đại, và mặc dù Java 8 là một bước tiến lớn, giới thiệu nhiều tính năng mà các nhà phát triển đã chờ đợi (như biểu thức lambda, hàm giao diện – interface methods), nhưng hiện tại Android mới chỉ hỗ trợ một phần các tính năng mà Java 8 cung cấp.
Bên cạnh đó, Java gặp vấn đề về thiếu khả năng mở rộng, null-unsafety (thay vào đó là NullPointerException), và thiếu sự hỗ trợ cho các tính năng lập trình hàm. Cho dù Java đã bắt đầu thêm một số yếu tố lập trình hàm với Java 8, nhưng về cơ bản Java vẫn là một ngôn ngữ thủ tục. Cú pháp của Java khá dài dòng, đặc biệt là khi so sánh với nhiều ngôn ngữ lập trình hiện đại.
Ưu điểm của Kotlin
Kế thừa từ Java
Đối với các nhà phát triển Java, hầu hết các cú pháp của Kotlin đều quen thuộc, ngắn gọn và dễ học. Ví dụ, một đoạn code được sử dụng để tạo ra một Activity mới trong Kotlin là rất giống với Java:
1
|
classMainActivity:AppCompatActivity(){
|
Không chỉ vậy, khả năng “tương tác ngôn ngữ” dễ dàng giữa Kotlin và Java khi viết ứng dụng cũng được coi là một điểm cộng đáng chú ý cho ngôn ngữ thế hệ mới này. Code Java và Kotlin hoàn toàn có thể tồn tại song song trong cùng một dự án, hoặc chuyển hẳn dự án sang Kotlin một cách thuận tiện, tất cả vẫn chạy một cách trơn tru nhờ độ tương thích cao của Kotlin đối với Java trên Android.
Với những đặc tính được kế thừa từ Java nên Kotlin có thể sử dụng tất cả các nền tảng và thư viện Java hiện có. Và mội điều quan trọng khác là Kotlin có thể dễ dàng tích hợp với Maven, Gradle và các hệ thống build khác.
Null-safety
Trước đây, với Java các lập trình viên Android luôn bị ám ảnh với tình trạng ứng dụng bị crash (dừng đột ngột) bởi NullPointerExceptions. Kotlin đã xử lý triệt để tình trạng này với cơ chế null-safety. Trong Kotlin, hệ thống sẽ từ chối biên dịch đoạn code đang gán hay trả về giá trị null.
1
2
3
|
val name:String=null // tries to assign null, won’t compile.
fun getName():String=null // tries to return null, won’t compile.
|
Data Classes
Trong Java, có một vài Data Class sẽ dẫn đến việc tự động tạo ra những đoạn code dài và cồng kềnh như equals, hashCode, toString, getter/setter… Còn Kotlin thì cú pháp sẽ ngắn gọn hơn, ví dụ với Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
/* Java Code */
classBook{
privateStringtitle;
privateAuthor author;
publicStringgetTitle(){
returntitle;
}
publicvoidsetTitle(Stringtitle){
this.title=title;
}
publicAuthor getAuthor(){
returnauthor;
}
publicvoidsetAuthor(Author author){
this.author=author;
}
}
|
Nhưng với Kotlin, class tương tự như trên chỉ cần định nghĩa bởi 1 dòng code:
1
2
3
|
/* Kotlin Code */
data classBook(vartitle:String,varauthor:Author)
|
Hàm mở rộng (Extension Functions)
Kotlin cho phép có thể mở rộng những chức năng của các class hiện có mà không cần kế thừa từ chúng, bằng các sử dụng hàm mở rộng. Nó được thực hiện bởi chức năng mở rộng. Ví dụ sau minh họa thêm một hàm swap vào lớp MutableList:
1
2
3
4
5
6
7
8
|
fun MutableList<Int>.swap(index1:Int,index2:Int){
val tmp=this[index1]
this[index1]=this[index2]
this[index2]=tmp
}
val abc=mutableListOf(1,2,3)
abc.swap(0,2)
|
Smart Casts
Trình biên dịch của Kotlin rất thông minh trong việc cast đối tượng. Trong nhiều trường hợp, lập trình viên không cần phải sử dụng pương thức cast trong Kotlin, nhưng Kotlin cũng vẫn hỗ trợ việc kiểm tra kiểu với những giá trị cố định và tự động cast khi cần thiết.
1
2
3
4
5
|
fun demo(x:Any){
if(xisString){
print(x.length) // x is automatically cast to string
}
}
|
Type Inference
Trong Kotlin, có thể lựa chọn hoặc chỉ rõ loại kiểu mỗi biến một cách rõ ràng hoặc không. Ví dụ:
1
2
3
4
5
6
7
8
9
10
11
|
/* not explicitly defined */
fun main(args:Array<String>){
val text=10
println(text)
}
/* explicitly defined */
fun main(args:Array<String>){
val text:Int=10
println(text)
}
|
Lập trình hướng chức năng
Kotlin là một ngôn ngữ lập trình hướng chức năng. Về cơ bản Kotlin hỗ trợ rất nhiều chức năng hữu ích như higher-order functions, biểu thức lambda, nạp chồng toán tử, lazy evaluation. Ví dụ:
1
2
3
4
5
|
/* Higher-order functions */
fun alphaNum(func:()->Unit){}
/* Lambda expression */
val sum:(Int,Int)->Int={x,y->x+y}
|
Kết luận
Với hàng loạt những ưu điểm riêng của mình, cộng với sự hậu thuẫn từ Google, chắc chắn Kotlin sẽ là tương lai của các ứng dụng di động. Tuy vậy, cũng sẽ cần một thời gian nữa để Kotlin có thể xây dựng được cộng đồng lập trình viên cho riêng mình.
Hoàng Vũ – FPT HO