12/08/2018, 15:20

Những tính năng mới mang tính cách mạng cho Android trong phiên bản Java 8

Java 8 là một bước tiến đỉnh cao cho ngôn ngữ Java. Những cập nhật mới của Java 8 là một việc lớn đối với Android và sẽ giúp cho các nhà phát triển dễ dàng hơn trong việc tạo ra các ứng dụng mới và dọn sạch mã hiện có. Tóm lại, java 8 là : "Tạo ra code sạch hơn và tinh giản toàn bộ quá ...

Java 8 là một bước tiến đỉnh cao cho ngôn ngữ Java. Những cập nhật mới của Java 8 là một việc lớn đối với Android và sẽ giúp cho các nhà phát triển dễ dàng hơn trong việc tạo ra các ứng dụng mới và dọn sạch mã hiện có.

Tóm lại, java 8 là :

"Tạo ra code sạch hơn và tinh giản toàn bộ quá trình"

Sự thay đổi từ Java 7 sang 8 đánh dấu một sự cập nhật lớn cho nền tảng mà Android và nhiều ứng dụng của nó được xây dựng.

Lollipop 5.0 là một trong những phiên bản ban đầu của Android mà đã đưa ra yêu cầu ứng dụng được xây dựng bằng cách sử dụng Java 7 và bây giờ Android N đang hiện đại hóa các thứ sang Java 8.

Bây giờ chúng ta hãy xem qua các tính năng của java 8 được hỗ trợ trong Android.

1. Default and static interface method

Trước java 8 chúng ta chỉ có thể khai báo phương thức trong interface, nhưng sau khi java 8 xuất hiện , chúng ta có thể định nghĩa các phương thức bằng cách sử dụng các từ khóa DefaultStatic .

Tuy nhiên cơ cấu mới này sẽ chỉ hoạt động trên thiết bị Android N.

Trước java 8 interface rất khó khăn để sửa đổi, nếu chúng ta cần một số phương thức bổ sung trong interface thì sau đó nó sẽ yêu cầu thay đổi trong tất cả các lớp triển khai.

Sau khi đưa vào java 8 chúng ta có thể dễ dàng sửa đổi interface và thêm các phương thức với định nghĩa với từ khoá DefaultStatic .

Default Methods

Các phương pháp mặc định interface Java sẽ giúp mở rộng các interface mà không lo ngại phá vỡ lớp triển khai.

Để tạo ra một phương thức mặc định trong interface, chúng ta cần phải sử dụng từ khóa " Default " với the method signature. Đây là một ví dụ cho thấy phương thức mặc định trong interface.

public interface MyInterface {
    void interfaceMethod();
    default void defaultMethod(){
        Log.v(TAG,"Default Method");
    }
}

public class MyClass extends AppCompatActivity implements MyInterface {
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        interfaceMethod("Hello World")
       Log.v(TAG+ defaultMethod());
   }
@Override
    public void interfaceMethod(String str) {
       Log.v(TAG + str);
    }    
}

Lớp thực hiện giao diện này không cần phải thực hiện phương pháp mặc định này.

Điều này sẽ giúp mở rộng interface với các phương thức bổ sung, tất cả những gì chúng ta cần phải cung cấp là một triển khai mặc định.

Static Methods

Phương thức tĩnh tương tự như các phương thức mặc định, sự khác biệt duy nhất là bạn không thể ghi đè chúng trong các lớp triển khai thực hiện.

Phương thức tĩnh cung cấp bảo mật bằng cách không cho phép các lớp thực hiện ghi đè chúng.

Kiểm tra phương thức tĩnh này trong giao diện.

public interface MyInterface {
    default void defaultMethod(){
        System.out.println("Default");
    }

    static void staticMethod(){
        System.out.println("Static");
    }    
}

public class MyClass extends AppCompatActivity implements MyInterface {

    public static void main(String[] args) {
          MyInterface.staticMethod(); //valid
    }
}

2. Lambda Expression

Một trong những tính năng mạnh mẽ trong java 8 là Lambda Expression, nó cho phép giữ cho cú pháp rõ ràng hơn và ít thổi phồng lên.

Trước java 8 nó sẽ không có nếu không thêm tool , nhưng bây giờ Lambda Expression sẽ làm việc trên các phiên bản của Android từ 2,3 (Gingerbread) trở lên.

Tóm lại, biểu thức lambda là một thay thế của lớp bên trong vô danh khi cung cấp trình nghe sự kiện.

Ví dụ: hãy xem xét trình lắng nghe nhấp chuột cơ bản chuẩn:

btnSave.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) 
     {
        Log.v(TAG, "Button clicked");
        Toast.makeText(MyActivity.this, "Main Activity",          Toast.LENGTH_LONG).show();    
     }
});

With Lambda expression :

btnSave.setOnClickListener(v -> { 
  Log.v(TAG, "Button clicked");
  Toast.makeText(MyActivity.this, "Main Activity",   Toast.LENGTH_LONG).show();
});

3. Enhancing Null Safety

Bất kì một develop cũng không thể quên được "The NullPointerExceptions", và đó là những gì mà chuyên gia java nghĩ và giới thiệu Optional.

Optional là một đối tượng container object có thể hoặc không thể chứa một giá trị khác null. Optional object được sử dụng để đại diện cho null với giá trị vắng mặt.

Để tương tác với giá trị, Optional cung cấp một tập hợp các phương thức hữu ích trừu tượng để check null.

Điều này cho phép chúng tôi có thêm mã súc tích và khai báo tập trung vào các chi tiết mà chúng tôi quan tâm.

Student student= new Student();
      String firstName= null;
      String lastName= new String();
  
      //Optional.ofNullable - allows passed parameter to be null.
      Optional<String> strFirstName= Optional.ofNullable(firstName);
  
      //Optional.of - throws NullPointerException if passed parameter is null
      Optional<String> strLastName= Optional.of(value2);
     Log.v(TAG,Student.display(strFirstName,strLastName));

4. Repeating Annotations

Khi chưa có java 8, không dễ dàng gì để declare nhiều hơn một chú thích của cùng một loại đến cùng một vị trí. Để làm được điều đó, chúng ta sẽ phải nhóm chúng trong container annotation.

Repeating annotation được giới thiệu trong java 8 có nghĩa là các same annotations có thể được lặp lại nhiều lần ở cùng vị trí bạn muốn.

Rất tiếc, bạn không thể sử dụng Repeating Annotation với SDK < 24.

// Declaring repeatable annotation type
@Repeatable(Student.class)
@interfaceStudent
{
   String name();
   String marks();
}
// Declaring container for repeatable annotation type@Retention(RetentionPolicy.RUNTIME)
@interfaceStudent
{
  Student[] value();
}
// Repeating annotation
@Student(name = “ABC”, marks= “50”)
@Student(name = “XYZ”, marks = “30”)
public class RepeatingAnnotationsDemo extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
   }
}

5. Stream Api

Stream là một lớp abstract mới được giới thiệu trong Java 8. Stream cho phép chúng tôi xử lý dữ liệu theo cách khai báo hoặc nói một cách quản lý khác. Sử dụng stream, developer không phải lo lắng về sự đồng thời và quản lý luồng vì nó xử lý dữ liệu khổng lồ rất hiệu quả. Dưới đây là ví dụ về stream api 0hiển thị những từ bắt đầu bằng chữ 'a'.

List<String> strList =
    Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList
    .stream()
    .filter(s -> s.startsWith("a"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);

Điểu không vui đó là Stream api cũng không có sẵn ở SDK < 24.

Điều kiện tiên quyết để sử dụng JAVA 8 trong studio android

  1. JDK 8 (Khi phát triển các ứng dụng cho Android, việc sử dụng các tính năng ngôn ngữ Java8 là tùy chọn. Bạn có thể giữ giá trị tương thích nguồn và đích của dự án được đặt thành Java 7, nhưng bạn vẫn phải biên dịch bằng JDK 8.)

  2. Trình biên dịch JACK

  3. Android studio 2.1 trở lên (Vì Jack chỉ được hỗ trợ trên Android Studio 2.1 trở lên nên nếu bạn muốn sử dụng các tính năng ngôn ngữ Java 8, bạn cần phải sử dụng Android Studio 2.1 và cao hơn để xây dựng ứng dụng của bạn.)

Xem cách người dùng có thể sử dụng java 8 trong studio android

Để sử dụng các tính năng ngôn ngữ Java 8 mới, bạn cũng cần sử dụng bộ công cụ Jack . Theo công cụ này jack cắm công cụ thông báo bị phản đối nhưng vẫn có thể tiếp tục sử dụng Jack để xây dựng mã Java 8 của họ cho đến khi một số phát hành mới xảy ra. Di chuyển từ Jack nên yêu cầu ít hoặc không có công việc.

Một tùy chọn khác là nhà phát triển có thể thử phiên bản xem trước mới nhất của Android Studio để sử dụng hỗ trợ được cải thiện cho các tính năng ngôn ngữ java 8 được tích hợp trong thanh công cụ mặc định.

Configure Gradle

Để bật các tính năng ngôn ngữ Java 8 và Jack cho dự án của bạn, hãy nhập các thông số sau vào tệp build.gradle cấp build.gradle bạn:

android {
  ...
  defaultConfig {
    ...
    jackOptions {
      enabled true
    }
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

Đây là những điểm nhất định từ java 8 khiến cho nó trở nên mạnh mẽ hơn bao giờ hết.

Đây là một chút nỗ lực của tôi để làm sáng lên những điểm mạnh mà java 8 đi kèm với Android.

Hy vọng điều này sẽ giúp bạn bắt đầu học tập và R & D của bạn về java 8 !!

0