Kotlin là gì? Sau đây là giải thích cho loại ngôn ngữ được xem là thay thế cho Java

Linh Le

Kotlin mang đến những lợi thế lớn hơn so với Java trong việc phát triển JVM và Android và hòa hợp với Java trong cùng những dự án. Vậy tại sao chúng ta không dùng thử ngôn ngữ này?

What is Kotlin? The Java alternative explained

Kotlin là một ngôn ngữ lập trình tĩnh, đa mục đích, mã nguồn mở dành cho JVM và Android kết hợp các tính năng lập trình hướng đối tượng và chức năng. Nó tập trung vào khả năng tương tác, an toàn, rõ ràng và hỗ trợ công cụ. Các phiên bản của Kotlin cho JavaScript (ECMAScript 5.1) và mã nguồn gốc (sử dụng LLVM) đang được thực hiện.

Kotlin có nguồn gốc từ JetBrains, công ty đứng sau IntelliJ IDEA, vào năm 2010 và là nguồn mở từ năm 2012. Nhóm Kotlin hiện có hơn 20 thành viên toàn thời gian từ JetBrains và dự án Kotlin trên GitHub có khoảng 100 người đóng góp. JetBrains sử dụng Kotlin trong nhiều sản phẩm của mình bao gồm cả sản phẩm hàng đầu IntelliJ IDEA.

convert java to kotlin

Thoạt nhìn, Kotlin trông giống như một phiên bản Java streamline. Hãy xem xét ảnh chụp màn hình ở trên, đã chuyển đổi một đoạn mã mẫu Java (ở bên trái) sang Kotlin một cách tự động. Lưu ý rằng sự lặp lại vô nghĩa vốn có trong việc khởi tạo các biến Java đã biến mất. Idiom Java

StringBuilder sb = new StringBuilder();

viết bằng Kotlin sẽ là

val sb = StringBuilder()

Bạn có thể thấy rằng các hàm được định nghĩa với từ khóa thú vị và các dấu chấm phẩy đó bây giờ là tùy chọn khi có dòng mới. Valkeyword khai báo thuộc tính chỉ đọc hoặc biến cục bộ. Tương tự, varkeyword tuyên bố một thuộc tính có thể thay đổi hoặc biến cục bộ.

Tuy nhiên, Kotlin được đánh máy mạnh mẽ. Các từ khóa val và var chỉ có thể được sử dụng khi loại có thể được suy ra. Nếu không, bạn cần khai báo kiểu. Loại suy luận dường như được cải thiện với mỗi bản phát hành của Kotlin.

Có một cái nhìn vào khai báo hàm gần đầu của cả hai panes. Kiểu trả về trong Java đứng trước mẫu thử nghiệm, nhưng trong Kotlin nó thành công nguyên mẫu, được phân định bằng dấu hai chấm như trong Pascal.

Nó không phải là hiển nhiên từ ví dụ này, nhưng Kotlin đã giải thích yêu cầu của Java rằng các chức năng là thành viên của lớp. Trong Kotlin, các hàm có thể được khai báo ở mức cao nhất trong một tệp, cục bộ bên trong các hàm khác, như một hàm thành viên bên trong một lớp hoặc một đối tượng và như một hàm mở rộng. Các hàm mở rộng cung cấp khả năng C # để mở rộng một lớp với chức năng mới mà không cần phải kế thừa từ lớp hoặc sử dụng bất kỳ kiểu mẫu thiết kế nào như Decorator.

Đối với người hâm mộ Groovy, Kotlin thực hiện các nhà xây dựng; trên thực tế, các nhà xây dựng Kotlin có thể được kiểm tra kiểu. Kotlin hỗ trợ các thuộc tính được ủy quyền, có thể được sử dụng để thực hiện các thuộc tính lười, các thuộc tính quan sát được, các thuộc tính có thể phủ nhận và các thuộc tính được ánh xạ.

Nhiều cơ chế không đồng bộ có sẵn trong các ngôn ngữ khác có thể được thực hiện như các thư viện sử dụng các coroutine Kotlin, được thử nghiệm trong Kotlin 1.1. Điều này bao gồm async/await từ C# và ECMAScript, các kênh và chọn Go, và generators/yield từ C# và Python.

Chức năng lập trình bằng Kotlin

lCho phép các hàm mức cao nhất chỉ mới là bước khởi đầu trong quá trình lập trình hàm cho Kotlin. Ngôn ngữ này cũng hỗ trợ các hàm bậc cao hơn, các hàm ẩn danh, lambdas, các hàm nội tuyến, các bao đóng (closure), đệ quy đuôi (tail recursion) và các generics. Nói cách khác, Kotlin có tất cả các tính năng và ưu điểm của một ngôn ngữ chức năng. Ví dụ, hãy xem xét các thành phần Kotlin chức năng sau đây.

Lọc danh sách bằng Kotlin
val positives = list.filter { x -> x > 0 }

Đối với một biểu thức ngắn hơn, hãy sử dụng nó khi chỉ có một tham số duy nhất trong hàm lambda:

val positives = list.filter { it > 0 }
Traversing một bản đồ / danh sách các cặp trong Kotlin
for ((k, v) in map) { println(“$k -> $v”) }

k và v có thể được gọi với tên bất kỳ.

Sử dụng range trong Kotlin
for (i in 1..100) { ... }  // closed range: includes 100
for (i in 1 until 100) { ... } // half-open range: does not include 100
for (x in 2..10 step 2) { ... }
for (x in 10 downTo 1) { ... }
if (x in 1..10) { ... } Even though Kotlin is a full-fledged functional programming language, it preserves most of the object-oriented nature of Java as an alternative programming style, which is very handy when converting existing Java code. Kotlin has classes with constructors, along with nested, inner, and anonymous inner classes, and it has interfaces like Java 8. Kotlin does nothave new keyword. To create a class instance, call the constructor just like a regular function. We saw that in the screenshot above.

Các ví dụ trên cho thấy từ khóa cũng như việc sử dụng các range.

Mặc dù Kotlin là một ngôn ngữ lập trình hàm chính thức, nó vẫn bảo toàn hầu hết tính chất hướng đối tượng của Java như là một kiểu lập trình thay thế, rất tiện dụng khi chuyển đổi mã Java hiện có. Kotlin có các lớp với các hàm tạo, cùng với các lớp bên trong lồng nhau (nested), bên trong (inner) và ẩn danh, và nó có các giao diện như Java 8. Kotlin không có từ khóa mới. Để tạo một cá thể lớp, hãy gọi hàm khởi tạo giống như một hàm bình thường. Chúng ta có thể thấy trong ảnh chụp màn hình ở trên.Mặc dù Kotlin là một ngôn ngữ lập trình hàm chính thức, nó vẫn bảo toàn hầu hết tính chất hướng đối tượng của Java như là một kiểu lập trình thay thế, rất tiện dụng khi chuyển đổi mã Java hiện có. Kotlin có các lớp với các hàm tạo, cùng với các lớp bên trong lồng nhau (nested), bên trong (inner) và ẩn danh, và nó có các giao diện như Java 8. Kotlin không có từ khóa mới. Để tạo một cá thể lớp, hãy gọi hàm khởi tạo giống như một hàm bình thường. Chúng ta có thể thấy trong ảnh chụp màn hình ở trên.

Kotlin có thừa kế đơn từ một lớp cha được đặt tên, và tất cả các lớp Kotlin đều có một lớp cha mặc định, Any, không giống như lớp cơ sở java.lang.ObjectAny chỉ chứa ba hàm thành viên được xác định trước: equals()hashCode(), và toString().

Các lớp Kotlin phải được đánh dấu bằng từ khóa open để cho phép các lớp khác kế thừa từ chúng; Các lớp Java là loại ngược lại, vì chúng có thể kế thừa trừ khi được đánh dấu bằng từ khóafinal. Để ghi đè lên một phương thức siêu lớp, chính phương thức đó phải được đánh dấu là open, và phương thức lớp con phải được đánh dấu là override. Đây là một phần của triết lý của Kotlin về việc làm cho mọi thứ rõ ràng hơn là dựa vào mặc định. Trong trường hợp đặc biệt này, tôi có thể thấy cách thức của Kotlin đánh dấu một cách rõ ràng các thành viên lớp cơ sở như mở cho các thành viên lớp thừa kế và thừa kế như các ghi đè tránh một số lỗi Java phổ biến.

Tính năng an toàn trong Kotlin

Nói về việc tránh các lỗi phổ biến, Kotlin được thiết kế để loại bỏ sự nguy hiểm của các tham chiếu con trỏ null và sắp xếp hợp lý việc xử lý các giá trị null. Nó thực hiện điều này bằng cách tạo ra một null bất hợp pháp cho các kiểu tiêu chuẩn, thêm các kiểu nullable và thực hiện các ký hiệu phím tắt để xử lý các phép thử cho null.

Ví dụ, một biến thường xuyên của kiểu String không thể giữ null:

var a : String ="abc" 
a = null // compilation error

Nếu bạn cần cho phép null, ví dụ để giữ các kết quả truy vấn SQL, bạn có thể khai báo một kiểu nullable bằng cách gắn thêm một dấu chấm hỏi vào kiểu, ví dụ String?.

var b: String? ="abc"
b = null // ok

Sự bảo vệ mở rộng hơn một chút. Bạn có thể sử dụng một loại không nullable với impunity, nhưng bạn phải kiểm tra một loại nullable cho các giá trị null trước khi sử dụng nó.

Để tránh ngữ pháp chi tiết cần thiết cho việc kiểm tra null, Kotlin giới thiệu safe call. Ví dụ, b?.length trả về b.length nếu b không null, và null. Loại biểu thức này là Int?.

Nói cách khác, b?.length là một phím tắt cho if (b != null) b.length else null. Cú pháp giúp tạo chuỗi tiện lợi, loại bỏ khá nhiều prolix logic, đặc biệt là khi một đối tượng đã được phổ biến từ một loạt các truy vấn cơ sở dữ liệu, bất kỳ trong số đó có thể đã thất bại. Ví dụ, bob?.department?.head?.name sẽ trả về tên của trưởng phòng Bob nếu Bob, phòng ban và trưởng phòng đều không có giá trị.

Để thực hiện một hoạt động nhất định chỉ cho các giá trị không null, bạn có thể sử dụng toán tử gọi an toàn ?. cùng với let:

val listWithNulls: List<String?> = listOf(“A”, null) 
for (item in listWithNulls) {
       item?.let { println(it) } // prints A and ignores null }

Thông thường, bạn muốn trả lại một giá trị hợp lệ nhưng đặc biệt từ một biểu thức rỗng, thường là để bạn có thể lưu nó vào một kiểu không nullable. Có một cú pháp đặc biệt cho điều này được gọi là toán tử Elvis (I kid you not) được viết ?:.

val l = b?.length ?: -1

tương đương với

val l: Int = if (b != null) b.length else -1

Trong cùng một vein, Kotlin thiếu các ngoại lệ đã kiểm tra của Java, đó là những điều kiện throwable phải được phát hiện. Ví dụ, chữ ký JDK

Appendable append(CharSequence csq) throws IOException;

yêu cầu bạn bắt IOException mỗi khi bạn gọi một phương thức chắp thêm:

try {
  log.append(message)
}
catch (IOException e) {
  // Do something with the exception
}

Các nhà thiết kế của Java nghĩ rằng đây là một ý tưởng hay, và nó là một chiến thắng thực sự cho các chương trình đồ chơi, miễn là các lập trình viên đã triển khai một cái gì đó hợp lý trong mệnh đề catch. Tất cả những gì quá thường xuyên trong các chương trình Java lớn, tuy nhiên, bạn thấy mã trong đó bắt buộc khoản bắt giữ không có gì trừ một bình luận: / / todo: xử lý điều này. Điều này không giúp được bất kỳ ai và kiểm tra ngoại lệ hóa ra là một mất mát đối với các chương trình lớn.

Kotlin dành cho Android

Cho đến tháng 5 năm 2017, ngôn ngữ lập trình được hỗ trợ chính thức duy nhất cho Android là Java và C ++. Google đã công bố hỗ trợ chính thức cho Kotlin trên Android tại Google I / O 2017 và bắt đầu với Android Studio 3.0 Kotlin được tích hợp vào bộ công cụ phát triển Android. Bạn có thể thêm Kotlin vào các phiên bản Android Studio cũ hơn bằng plugin.

Kotlin biên dịch thành cùng một mã byte như Java, tương tác với các lớp Java theo cách tự nhiên và chia sẻ công cụ của nó với Java. Bởi vì không có chi phí để gọi qua lại giữa Kotlin và Java, việc thêm Kotlin tăng dần lên một ứng dụng Android hiện đang trong Java có ý nghĩa hoàn hảo. Một số ít trường hợp khả năng tương tác giữa mã Kotlin và Java thiếu các đặc tính, chẳng hạn như các thuộc tính chỉ có Java, hiếm khi gặp phải và dễ dàng sửa.

Pinterest là con áp phích cho các ứng dụng Android được viết ở Kotlin sớm nhất là tháng 11 năm 2016 và được đề cập nổi bật tại Google I / O 2017 như một phần của thông báo Kotlin. Ngoài ra, nhóm Kotlin thích trích dẫn các ứng dụng Evernote, Trello, Square và Coursera cho Android.

Kotlin vs. Java

Câu hỏi liệu có nên chọn Kotlin hay Java cho phát triển mới đã xuất hiện rất nhiều trong cộng đồng Android kể từ khi thông báo Google I / O, mặc dù mọi người đã đặt câu hỏi vào tháng 2 năm 2016 khi Kotlin 1.0 xuất xưởng. Câu trả lời ngắn gọn là mã Kotlin an toàn hơn và ngắn gọn hơn mã Java, và các tệp Kotlin và Java có thể cùng tồn tại trong các ứng dụng Android, do đó Kotlin không chỉ hữu ích cho các ứng dụng mới mà còn mở rộng các ứng dụng Java hiện có.

Đối số duy nhất mà tôi đã thấy khi chọn Java trên Kotlin sẽ là trường hợp của những người mới phát triển Android hoàn chỉnh. Đối với họ, có thể có một rào cản để vượt qua được rằng hầu hết các tài liệu và ví dụ của Android đều có trong Java. Mặt khác, việc chuyển đổi Java sang Kotlin trong Android Studio là một vấn đề đơn giản khi dán mã Java vào một tệp Kotlin.

Đối với hầu hết những người khác làm phát triển Android, những lợi thế của Kotlin là hấp dẫn. Thời gian điển hình được trích dẫn cho một nhà phát triển Java để tìm hiểu Kotlin là một vài giờ – một mức giá nhỏ để trả để loại bỏ lỗi tham chiếu null, cho phép các chức năng mở rộng, hỗ trợ lập trình hàm và thêm coroutines.

Kotlin vs. Scala

Câu hỏi về việc chọn Kotlin hay Scala không thường xuyên xuất hiện trong cộng đồng Android vì công cụ hỗ trợ Android cho Scala không phải là rất tốt và thư viện Scala dành cho Android có xu hướng ở phía lớn. Mặt khác, cộng đồng Scala nhận thức sâu sắc về các vấn đề và đang nghiên cứu các giải pháp cho họ.

Trong các môi trường khác, tình hình là khác nhau. Ví dụ, Apache Spark chủ yếu được viết bằng Scala và các ứng dụng dữ liệu lớn cho Spark thường được viết bằng Scala.

Theo nhiều cách, cả Scala và Kotlin đại diện cho sự hợp nhất của lập trình hướng đối tượng, như được minh họa bởi Java, với lập trình hàm. Hai ngôn ngữ chia sẻ nhiều khái niệm và ký hiệu, chẳng hạn như khai báo bất biến bằng cách sử dụng khai báo val và có thể thay đổi bằng var, nhưng hơi khác trên các biến khác, chẳng hạn như vị trí đặt mũi tên khi khai báo hàm lambda và sử dụng mũi tên đơn hay kép mũi tên. Lớp dữ liệu Kotlin ánh xạ tới lớp trường hợp Scala.

Kotlin định nghĩa các biến nullable theo cách tương tự với Groovy, C # và F #; hầu hết mọi người nhận được nó một cách nhanh chóng. Mặt khác, Scala định nghĩa các biến nullable bằng cách sử dụng tùy chọn đơn nguyên, điều này có thể khiến cho một số tác giả dường như nghĩ rằng Scala không có sự an toàn vô giá trị.

Một thâm hụt rõ ràng của Scala là thời gian biên dịch của nó có xu hướng dài, một điều rõ ràng nhất khi bạn xây dựng một cơ thể lớn của Scala, chẳng hạn như kho Spark, từ nguồn. Kotlin, mặt khác, được thiết kế để biên dịch nhanh chóng trong các kịch bản phát triển phần mềm thường xuyên nhất, và trên thực tế thường biên dịch nhanh hơn mã Java.

Kotlin interoperability with Java

Tại thời điểm này, bạn có thể tự hỏi Kotlin xử lý các kết quả của các cuộc gọi khả năng tương tác Java như thế nào, với các khác biệt về xử lý null và các ngoại lệ đã kiểm tra. Kotlin âm thầm và tin cậy vào những gì được gọi là “loại nền tảng” hoạt động giống như một loại Java, có nghĩa là không có giá trị nhưng có thể tạo ra ngoại lệ null-pointer. Kotlin cũng có thể tiêm một xác nhận vào mã tại thời gian biên dịch để tránh kích hoạt một ngoại lệ con trỏ null thực tế. Không có ký hiệu ngôn ngữ rõ ràng cho loại nền tảng, nhưng trong trường hợp Kotlin phải báo cáo loại nền tảng, chẳng hạn như trong thông báo lỗi, nó sẽ thêm vào! cho loại.

Trong hầu hết các trường hợp, việc gọi mã Java từ Kotlin hoạt động theo cách bạn có thể mong đợi. Ví dụ, bất cứ lúc nào cả hai getters và setters tồn tại trong một lớp Java, Kotlin coi chúng là các thuộc tính có cùng tên. Tương tự, các phương thức truy cập Boolean được coi là các thuộc tính có cùng tên với phương thức getter. Ví dụ:

import java.util.Calendar  

fun calendarDemo() {
     val calendar = Calendar.getInstance()
     if (calendar.firstDayOfWeek == Calendar.SUNDAY) {  // call getFirstDayOfWeek()
         calendar.firstDayOfWeek = Calendar.MONDAY      // call setFirstDayOfWeek()
     }
     if (!calendar.isLenient) {                       // call isLenient()
         calendar.isLenient = true                    // call setLenient()
     }
 }

Lược đồ này phân tích cho trường hợp các thuộc tính chỉ có Java, chưa được hỗ trợ trong Kotlin. Nếu một lớp Java chỉ có một setter, nó sẽ không được hiển thị như một thuộc tính trong Kotlin.

Khả năng tương tác của Kotlin với Java mở rộng đến các công cụ Java. Kotlin không có trình soạn thảo hoặc IDE riêng; nó có các trình cắm thêm cho các trình soạn thảo và IDE phổ biến của Java, bao gồm IntelliJ IDEA, Android Studio và Eclipse. Kotlin không có hệ thống xây dựng riêng; nó sử dụng Gradle, Maven và Ant.

Khả năng tương tác của Kotlin với JavaScript

Bạn có thể sử dụng Kotlin để viết mã cho trình duyệt và Node.js. Với mục tiêu này, Kotlin được chuyển thành JavaScript ES5.1 thay vì được biên dịch sang mã byte JVM.

Vì JavaScript là một ngôn ngữ động, Kotlin cho JavaScript thêm một kiểu động không có sẵn trong Kotlin cho JVM:

val dyn: dynamic = …
Trình kiểm tra kiểu Kotlin bỏ qua các kiểu động và cho phép JavaScript xử lý chúng theo thời gian chạy. Biểu thức sử dụng các giá trị của loại động được dịch sang JavaScript như được viết. Một lần nữa, Kotlin về cơ bản punts và cho phép JavaScript giải thích các biểu thức trong thời gian chạy.

Bạn có thể gọi JavaScript từ Kotlin theo hai cách: sử dụng các kiểu động hoặc sử dụng các tiêu đề Kotlin gõ mạnh cho các thư viện JavaScript. Để truy cập các khuôn khổ JavaScript nổi tiếng của bên thứ ba với một API được đánh mạnh, bạn có thể chuyển đổi các định nghĩa TypeScript từ kho lưu trữ định nghĩa kiểu DefinitelyTyped thành Kotlin bằng cách sử dụng công cụ ts2kt.

Bạn có thể mã JavaScript trực tiếp dưới dạng văn bản vào mã Kotlin của bạn bằng cách sử dụng hàm js (“…”). Bạn có thể đánh dấu các khai báo gói trong mã Kotlin là JavaScript thuần túy với công cụ sửa đổi bên ngoài. Bạn có thể gọi mã Kotlin từ JavaScript, nhưng bạn cần sử dụng tên đầy đủ.

Nhìn chung, Kotlin cung cấp một số lợi thế hơn Java để mã được chạy trên JVM, và cũng có thể tạo ra JavaScript và mã nguồn gốc. So với Java, Kotlin an toàn hơn, súc tích hơn và rõ ràng hơn. Nó hỗ trợ lập trình chức năng ngoài lập trình hướng đối tượng, cung cấp một loạt các tính năng hữu ích (các hàm mở rộng, trình xây dựng, coroutines, lambdas, v.v.), và cung cấp sự an toàn null thông qua các kiểu nullable và non-nullable. Hơn hết, nếu bạn đã biết Java, bạn sẽ có hiệu quả trong Kotlin ngay lập tức.

Chia sẻ bài viết ngay

Nguồn bài viết : https://www.infoworld.com