Có gì mới trong Java 17?

Spread the love

Phiên bản Hỗ trợ dài hạn (LTS) của ngôn ngữ Java và nền tảng thời gian chạy Java 17 đã ra mắt vào ngày 14 tháng 9 năm 2021. Hãy cùng tìm hiểu những điểm mới trong Java 17 và liệu bạn có nên nâng cấp hay không.

Nhiều ứng dụng sử dụng các phiên bản Java cũ hơn, bao gồm các phiên bản LTS cũ hơn của Java: Java 11 và Java 8.

Tại sao doanh nghiệp nên nâng cấp lên phiên bản Java mới nhất? Việc nâng cấp lên java17 đòi hỏi nỗ lực, chủ yếu để tận dụng tối đa các tính năng và chức năng mới bên trong JVM.

Nhiều doanh nghiệp sử dụng Docker và Docker image để chuyển sang Java 17 một cách dễ dàng với nỗ lực và thời gian tối thiểu. Các nhà phát triển có thể xác định quy trình tích hợp/triển khai liên tục (CI/CD) của họ và chạy mọi thứ trong hình ảnh Docker. Điều này sẽ không ảnh hưởng đến các nhóm khác sử dụng các phiên bản Java cũ hơn vì họ có thể sử dụng các hình ảnh Docker cũ.

Tính năng Java 17

Hỗ trợ macOS và AArch64

Một trong những tính năng quan trọng của JVM được thêm vào phiên bản này là tăng cường hỗ trợ cho macOS trên kiến ​​trúc AArch64 bằng cách sử dụng JEP 391. Nó sẽ hỗ trợ loạt bộ xử lý (M1) mới nhất mà Apple đã phát hành cùng với máy tính của họ vào năm ngoái.

Nó không nhất thiết phải là vấn đề lớn đối với người dùng trên các nền tảng đó vì một số nhà cung cấp đã tung ra các phiên bản JDK hỗ trợ kiến ​​trúc này và thậm chí hỗ trợ trở lại từ Java 8. Tuy nhiên, con dấu chấp thuận chính thức là điều cần thiết để đảm bảo duy trì và hỗ trợ trong tương lai của nền tảng. Để so sánh, hỗ trợ cho nền tảng Linux/AArch64 đã được thêm vào Java 9 và Windows/AArch64 trong Java 16.

Lớp học niêm phong

Lớp niêm phong là một tính năng đã được giới thiệu trong Java 17. Tính năng Lớp niêm phong đã kết thúc giai đoạn thử nghiệm và đã trở thành một nền tảng và ngôn ngữ chính thức trong Java 17. Nó cho phép nhà phát triển chỉ định các loại phụ được phép mà một loại có thể có và ngăn chặn những người khác mở rộng hoặc thực hiện nó theo cách không được dự định.

Các lớp được niêm phong cũng cho phép trình biên dịch tạo ra lỗi tại thời điểm biên dịch khi bạn cố gắng chuyển đổi một loại không được niêm phong thành một kiểu con không được phép. Java 17 cũng mang đến một kênh kết xuất mới cho các ứng dụng AWT/Swing chạy trên macOS bằng API Apple Metal thay vì OpenGL. Nó có API cải tiến và các tính năng nâng cao để tạo số ngẫu nhiên.

  Cách kiểm tra xem một ô không trống trong Google Trang tính

Các thay đổi, xóa và giới hạn trong Java 17

Java 17 cũng mang đến một số thay đổi, xóa bỏ và giới hạn mới.

Đóng gói JDK Internals

Một thay đổi là kết thúc quá trình đóng gói của JDK Internals. Lần đầu tiên điều này được giới thiệu là trong Java 9 và sẽ đưa ra cảnh báo trong thời gian chạy khi người dùng cố gắng sử dụng sự phản chiếu hoặc tương tự để phá vỡ các hạn chế thông thường đối với việc sử dụng API nội bộ. Các đối số dòng lệnh cũng được thêm vào để điều chỉnh hành vi này.

Từ Java 9, nhiều API khác nhau đã được tạo ra để cung cấp một cách thống nhất để thực hiện các tác vụ được sử dụng phổ biến nhất; người dùng sẽ sử dụng các API này trong nội bộ. Với Java 16, mặc định đã được thay đổi từ cảnh báo thành vô hiệu hóa quyền truy cập để đưa ra một ngoại lệ. Tuy nhiên, nó sử dụng đối số dòng lệnh để thay đổi hành vi.

Với Java 17, đối số dòng lệnh bị loại bỏ và có thể hủy kích hoạt hạn chế này. Điều này có nghĩa là tất cả quyền truy cập trái phép vào các API nội bộ đó hiện đã được bảo vệ.

Ngữ nghĩa dấu phẩy động luôn nghiêm ngặt

Một “loại bỏ” bổ sung có thể được mô tả là giới thiệu lại ngữ nghĩa Dấu phẩy động luôn nghiêm ngặt. Java 1.2 đã giới thiệu các sửa đổi đối với mặc định ngữ nghĩa dấu phẩy động trong Java, cho phép JVM trao đổi một lượng nhỏ độ chính xác trong các phép tính dấu phẩy động để cải thiện hiệu suất. Trong các lớp và phương thức phải sử dụng ngữ nghĩa chặt chẽ, một từ khóastrictfp đã được thêm vào. Kể từ đó, nhiều loại tập lệnh khác nhau đã được đưa vào CPU, giúp sử dụng ngữ nghĩa dấu chấm động nghiêm ngặt mà không tốn chi phí không cần thiết. Nhu cầu thực hiện một ngữ nghĩa mặc định hoặc nghiêm ngặt đã bị loại bỏ.

Java 17 loại bỏ ngữ nghĩa mặc định trước đó và tất cả các hoạt động của dấu phẩy động được thực thi nghiêm ngặt. Thuật ngữ nghiêm ngặt vẫn còn tồn tại. Tuy nhiên, nó không có tác dụng và gây ra cảnh báo khi biên dịch.

Tổng hợp trước thời hạn (AOT)

Java 9 đã giới thiệu trình biên dịch trước thời hạn (AOT) như một tính năng thử nghiệm sử dụng trình biên dịch Graal và mã JIT được viết bằng Java. Java 10 đã làm cho trình biên dịch Graal có thể sử dụng được như một trình biên dịch JIT trong OpenJDK bằng cách kết hợp giao diện JVMCI. Kể từ khi nó được phát hành, nó đã là một cải tiến lớn. Trình biên dịch Graal đã có những tiến bộ to lớn và có JVM của nó dưới tên GraalVM.

Kích hoạt RMI

Kích hoạt RMI đã bị loại bỏ trong JEP 407 sau khi nó bị xóa khỏi Java 8 và cuối cùng không được dùng nữa và được đánh dấu là bắt buộc phải xóa trong Java 15. Kích hoạt RMI đã cung cấp một phương pháp để kích hoạt các đối tượng phân tán tài nguyên theo yêu cầu bằng RMI. Tuy nhiên, nó đã được sử dụng tối thiểu và hiện tại đã có một giải pháp thay thế tốt hơn. Phần còn lại của RMI không bị ảnh hưởng bởi việc loại bỏ phần Kích hoạt.

  Paladins đổi mã để nhận da miễn phí

Loại bỏ Applet API

Applet API cuối cùng đã được chỉ định để loại bỏ bởi JEP 398, ban đầu bị loại bỏ trong Java 9. Applet API cung cấp một cách để tích hợp các điều khiển Java AWT/Swing vào một trang web trong trình duyệt. Tuy nhiên, không có trình duyệt hiện đại nào có thể hỗ trợ điều này, điều đó có nghĩa là Applet về cơ bản không thể truy cập được trong thập kỷ qua hoặc lâu hơn.

Quản lí an ninh

Sự phản đối quan trọng nhất là trình quản lý bảo mật ( JEP 411). Trình quản lý bảo mật đã được sử dụng một thời gian kể từ Java 1.0. Nó được thiết kế để hạn chế những gì Java có thể thực hiện cục bộ trên máy, chẳng hạn như hạn chế quyền truy cập vào mạng, tệp và các tài nguyên mạng khác. Nó cũng cố gắng xử lý mã hộp cát không đáng tin cậy bằng cách chặn phản chiếu và các API cụ thể.

Phần cuối của Trình quản lý bảo mật bắt đầu từ Java 12. Một đối số dòng lệnh đã được thêm vào để chặn việc sử dụng trình quản lý bảo mật khi chạy. Thay đổi được thực hiện trong Java 17 có nghĩa là một cảnh báo thời gian chạy sẽ được tạo trong JVM khi cố gắng đặt Trình quản lý bảo mật, từ dòng lệnh hoặc tự động trong thời gian chạy.

Các tính năng của Vườn ươm và Xem trước

Nhiều người thắc mắc liệu Java 17 có bất kỳ tính năng xem trước và lồng ấp nào hay không, vì Java 17 đã được quảng cáo là phiên bản được hỗ trợ dài hạn. Java 17 có hai mô-đun vườn ươm và tính năng xem trước!

API véc tơ

API vectơ ( JEP 414) hiện đang trong giai đoạn thứ hai của lồng ấp. API cho phép các nhà phát triển xác định phép tính véc-tơ mà trình biên dịch JIT sau đó sẽ chuyển đổi thành lệnh véc-tơ thích hợp được hỗ trợ bởi kiến ​​trúc CPU mà JVM chạy trên đó (ví dụ: sử dụng các lệnh của bộ lệnh SSE hoặc AVX).

Trước đây, các nhà phát triển phải sử dụng các hàm vô hướng hoặc xây dựng các thư viện gốc dành riêng cho nền tảng. Việc triển khai API Vector trong Java cũng cung cấp một cơ chế dự phòng liền mạch vốn phức tạp trong các phiên bản trước.

Việc tiêu chuẩn hóa API Vector cho phép các lớp trong JDK sử dụng nó. Thay vào đó, các phương thức Java Arrays mismatch() có thể được thay đổi để chạy trên Java, loại bỏ yêu cầu duy trì và viết nhiều triển khai dành riêng cho nền tảng trong JVM.

Chức năng nước ngoài & API bộ nhớ

Một tính năng lồng ấp bổ sung được gọi là API bộ nhớ & hàm ngoại ( JEP 412). Đó là sự phát triển và hợp nhất của hai mô-đun vườn ươm khác của Java 16 đó là API trình liên kết nước ngoài ( JEP 389) và API bộ nhớ ngoài ( JEP 393). Cả hai đều cung cấp quyền truy cập vào bộ nhớ riêng và mã bằng cách sử dụng lập trình kiểu tĩnh được viết bằng Java.

Khớp mẫu cho Switch

Tính năng cuối cùng của bản xem trước ngôn ngữ có trong Java 17 là bao gồm Khớp mẫu cho Switch ( JEP 406). Tính năng ngôn ngữ này mở rộng các biểu thức và câu lệnh chuyển đổi theo loại, tương tự như cú pháp được sử dụng thông qua Khớp mẫu (JEP 394), đã trở thành tiêu chuẩn với Java 16.

  Cách tải Ảnh trong ảnh cho các cuộc gọi trên Google Meet

Trước đây, nếu bạn muốn thực hiện các hành động khác nhau dựa trên tính chất động của một đối tượng, bạn phải xây dựng một chuỗi if-else bằng cách sử dụng một ví dụ kiểm tra, chẳng hạn như:

String type(Object o) {
  if (o instanceof List) {
    return "A List of things.";
  }
  else if (o instanceof Map) {
    return "A Map! It has keys and values.";
  }
  else if (o instanceof String) {
    return "This is a string.";
  }
  else {
    return "This is something else.";
  }
}

Bằng cách kết hợp biểu thức công tắc cũng như tính năng khớp mẫu mới cho công tắc, quy trình có thể được rút gọn thành một thứ tương tự như:

String type(Object o) {
  return switch (o) {
    case List l -> "A List of things.";
    case Map m -> "A Map! It has keys and values.";
    case String s -> "This is a string.";
    default -> "This is something else.";
  };
}

Như bạn có thể nhận thấy, có sự khai báo của một biến trong quá trình kiểm tra. Giống như các biến khác trong Mẫu, đối sánh thể hiện chỉ ra rằng đối tượng này đã được kiểm tra kiểu và truyền và có sẵn từ biến trong khu vực hiện tại của nó.

Chức năng xem trước là một bước khác để đối sánh mẫu. Bước tiếp theo là bao gồm khả năng giải cấu trúc các mảng và bản ghi.

Bạn có nên nâng cấp lên Java 17 không?

Có, bạn phải liên tục nâng cấp lên phiên bản mới nhất, tuy nhiên không phải ngay trong ngày đầu tiên. Phần mềm và thư viện bạn đang sử dụng có thể chưa được cập nhật để tương thích với Java 17, vì vậy bạn có thể phải đợi một lúc cho đến khi quá trình này hoàn tất.

Nếu bạn đang gặp khó khăn với phiên bản LTS của Java như Java 8 hoặc Java 11, có rất nhiều tùy chọn trong ngôn ngữ và trong chính JVM yêu cầu nâng cấp lên Java 17. Với việc đây là bản phát hành bảo trì dài hạn, có khả năng cao là môi trường sản xuất của bạn cuối cùng cũng sẽ được cập nhật lên Java 17.

Nếu bạn đang bắt đầu một dự án hoàn toàn mới hoặc đang trong quá trình chuẩn bị cho dự án của mình và sẵn sàng cho Java 17, thì việc chuyển sang Java 17 càng sớm càng tốt có lẽ là lựa chọn hiệu quả nhất vì nó giúp giảm chi phí di chuyển. Điều này cũng cho phép các nhà phát triển làm việc trong dự án sử dụng tất cả các tính năng mới nhất và mặt vận hành.

Bạn có thể tận dụng nhiều cải tiến đã xảy ra trong vài năm qua, chẳng hạn như hỗ trợ cải tiến cho các bộ chứa chạy trên Java, cũng như triển khai trình thu gom rác có độ trễ thấp mới.

x