12/08/2018, 17:57

Taking Advantage of Kotlin part 1

Kể từ Google I/O 2017, Kotlin đã ngày càng được sử dụng rộng rãi hơn trong phát triển ứng dụng, các phiên bản cập nhật cũng ngày càng mang lại nhiều tiện ích cho dev. Bài viết này mình xin giới thiệu các chuyển từ Java sang Kotlin cùng với một số tips cho người mới. Configure Kotlin Đầu tiên để ...

Kể từ Google I/O 2017, Kotlin đã ngày càng được sử dụng rộng rãi hơn trong phát triển ứng dụng, các phiên bản cập nhật cũng ngày càng mang lại nhiều tiện ích cho dev. Bài viết này mình xin giới thiệu các chuyển từ Java sang Kotlin cùng với một số tips cho người mới.

Configure Kotlin

Đầu tiên để có thể sử dụng Kotlin tools và methods, bạn phải cài đặt Kotlin trên Project của bạn

  1. Trong Android Studio, chọn Tools > Kotlin > Configure Kotlin Plugin Updates > chọn Stable channel > click Check for updates now > click Install.
  2. chọn Tools > Kotlin > Configure Kotlin in Project > tại Choose Configurator, chọn Android with Gradle > chọn All modules và click OK
  3. Cuối cùng ấn Sync project và đợi complete

Note: Khi bạn sử dụng Android Studio 3.0 trở lên thì khi tạo mới project thì đã có thể tick chọn Include Kotlin support ngay từ khi khởi tạo rồi, và không cần thực hiện các bước trên

Kotlin Conversion Basics

Convert the POJO class to a Kotlin Data Class

Trong mục này, mình sẽ đưa ra 1 class Contact.java, 1 standard POJO:

public class Contact {

   private String firstName;
   private String lastName;   
   private String email;  

   public Contact(String firstName, String lastName, String email) {
      this.firstName = firstName;
      this.lastName = lastName;
      this.email = email;
   }
   
   public String getFirstName() {
      return firstName;
   }

   public String getLastName() {
      return lastName;
   }
   
   public String getEmail() {
      return email;
   }
   
   public void setEmail(String email ) {
      this.email = email;
   }
}

Problems with the Contact class file

Như đã nói trên class Contact là một standard POJO code, cụ thể gồm:

  • Private fields: 3 String
  • Một constructor để khởi tạo và set data cho các field
  • Phương thức set cho email field
  • Phương thức get cho tất cả các field

Vậy một POJO như vậy thì gặp phải những vấn đề gì?

  1. Nullability: Tất cả các field có thể null không? Như trong ví dụ 2 trường: firstName, lastName chỉ được thiết lập qua hàm khởi tạo, và không tồn tại phương thức set, vậy ngụ ý ở đây là 2 trường này sẽ là không null, nhưng như vậy có đảm bảo được chúng không null? Chúng ta vẫn có thể truyền null vào cho các trường này. Còn đối với trường email, nó có một phương thức set, nhưng như vậy ta có thể hiểu trường email là not-null hay nullable? Không rõ ràng một chút nào.
  2. Mutability: Trong 3 trường trên thì trường nào có thể thay đổi được, trường nào không? Như trong ví dụ thì ta thấy có mỗi trường email là có tồn tại phương thức set, vậy nó là mutable, còn firstName và lastName là immutable

Thực tế Java không ép buộc bạn phải xem xét đến các trường hợp null, cũng như thiết lập các trường với ý nghĩa read-only, và chính điều này có thể dẫn đến NullPointerException - một exception rất phổ biến mà chúng ta gặp phải khi phát triển app.

Kotlin có thể giúp giải quyết vấn đề này rất đơn giản, và hơn thế nữa là nó bắt dev phải suy nghĩ đến vấn đề này ngay từ lúc code chứ không phải đến lúc chạy app rồi mới check đến. Đây là 1 điều rất hay, có thể giúp xây dựng và phát triển kỹ năng của dev trở lên tốt hơn.

Use the converter

Làm sao để chuyển Contact.java sang Kotlin, bạn có thể tự viết lại class này bằng Kotlin. Nhưng ở đây mình sẽ giới thiệu đến 1 tool có sẵn, và nó sẽ phù hợp hơn với các bạn mới bắt đầu chuyển từ Java sang Kotlin:

  1. Chọn class Contact.java
  2. Chọn Code > Convert Java File to Kotlin File
  3. Nếu có xuất hiện 1 dialog thông báo nào đó thì ấn OK

Như vậy là chúng ta đã convert được class Contact.java sang Contact.kt một các dễ dàng:

internal class Contact(val firstName: String, val lastName: String, var email: String?)

Thật ngắn gọn phải không             </div>
            
            <div class=

0