Bản phát hành Java SE 17

Sau sáu tháng phát triển, Oracle đã phát hành Java SE 17 (Nền tảng Java, Phiên bản tiêu chuẩn 17), sử dụng dự án nguồn mở OpenJDK làm triển khai tham chiếu. Ngoại trừ việc loại bỏ một số tính năng không dùng nữa, Java SE 17 duy trì khả năng tương thích ngược với các bản phát hành trước đó của nền tảng Java—hầu hết các dự án Java được viết trước đây sẽ vẫn hoạt động mà không cần sửa đổi khi chạy phiên bản mới. Các bản dựng có thể cài đặt của Java SE 17 (JDK, JRE và Server JRE) được chuẩn bị cho Linux (x86_64, AArch64), Windows (x86_64) và macOS (x86_64, AArch64). Được phát triển bởi dự án OpenJDK, triển khai tham chiếu Java 17 hoàn toàn mở theo giấy phép GPLv2 với các ngoại lệ GNU ClassPath để cho phép liên kết động tới các sản phẩm thương mại.

Java SE 17 được phân loại là bản phát hành Hỗ trợ dài hạn (LTS) với các bản cập nhật cho đến năm 2029. Các bản cập nhật cho bản phát hành tạm thời trước đây của Java 16 đã bị ngừng. Nhánh Java 11 LTS trước đó sẽ được hỗ trợ cho đến năm 2026. Bản phát hành LTS tiếp theo dự kiến ​​vào tháng 2024 năm 10. Nhớ lại rằng bắt đầu với việc phát hành Java XNUMX, dự án đã chuyển sang một quy trình phát triển mới, ngụ ý một chu kỳ ngắn hơn để hình thành các bản phát hành mới. Chức năng mới hiện đang được phát triển trong một nhánh chính được cập nhật liên tục, kết hợp các thay đổi đã hoàn thành và từ đó các nhánh được phân nhánh sáu tháng một lần để ổn định các bản phát hành mới.

Các tính năng mới trong Java 17 bao gồm:

  • Một triển khai thử nghiệm đối sánh mẫu trong các biểu thức "chuyển đổi" được đề xuất, cho phép sử dụng các giá trị không chính xác trong nhãn "trường hợp", nhưng các mẫu linh hoạt ngay lập tức bao gồm một loạt các giá trị mà các chuỗi "nếu ... other" đã được sử dụng trước đó. Ngoài ra, bên trong "công tắc" được cung cấp khả năng xử lý các giá trị NULL. Đối tượng o = 123L; Chuỗi được định dạng = switch (o) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); trường hợp Chuỗi s -> String.format("Chuỗi %s", s); mặc định -> o.toString(); };
  • Hỗ trợ cho các lớp và giao diện được niêm phong mà các lớp và giao diện khác không thể sử dụng để kế thừa, mở rộng hoặc ghi đè triển khai đã được ổn định. Các lớp được niêm phong cũng cung cấp một cách khai báo hơn để hạn chế việc sử dụng một lớp cha hơn là các công cụ sửa đổi truy cập, dựa trên sự liệt kê rõ ràng các lớp con được phép mở rộng. gói com.example.geometry; lớp kín công khai Giấy phép hình dạng com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {…}
  • Triển khai sơ bộ thứ hai của API Vector được đề xuất, cung cấp các chức năng tính toán vectơ được thực hiện bằng hướng dẫn vectơ của bộ xử lý x86_64 và AArch64, đồng thời cho phép bạn áp dụng đồng thời các thao tác cho một số giá trị cùng một lúc (SIMD). Không giống như các khả năng được cung cấp trong trình biên dịch HotSpot JIT để tự động véc tơ hóa các hoạt động vô hướng, API mới cho phép kiểm soát rõ ràng việc véc tơ hóa để xử lý dữ liệu song song.
  • Việc triển khai sơ bộ API Bộ nhớ & Chức năng Ngoại đã được thêm vào, nhờ đó các ứng dụng có thể tương tác với mã và dữ liệu bên ngoài thời gian chạy Java. API mới cho phép bạn gọi các hàm không phải JVM một cách hiệu quả và truy cập bộ nhớ không được quản lý bởi JVM. Ví dụ: bạn có thể gọi các chức năng từ các thư viện được chia sẻ bên ngoài và truy cập dữ liệu quy trình mà không cần sử dụng JNI.
  • Công cụ kết xuất macOS cung cấp năng lượng cho API Java 2D, sau đó được cung cấp bởi API Swing, đã được điều chỉnh để sử dụng API đồ họa kim loại. Mặc định trên macOS vẫn là OpenGL và việc bật hỗ trợ Metal yêu cầu đặt tùy chọn "-Dsun.java2d.metal=true" và có ít nhất một bản phát hành macOS 10.14.x.
  • Đã thêm cổng cho nền tảng macOS/AArch64 (máy tính Apple dựa trên chip Apple M1 mới). Một tính năng của cổng là hỗ trợ cơ chế bảo vệ bộ nhớ W^X (Write XOR Execute), trong đó các trang bộ nhớ không thể có sẵn đồng thời để ghi và thực thi. (mã chỉ có thể được thực thi sau khi tắt tính năng ghi và chỉ có thể ghi vào trang bộ nhớ sau khi tắt tính năng thực thi).
  • Trả lại việc sử dụng ngữ nghĩa chỉ nghiêm ngặt (strictfp) cho các biểu thức dấu phẩy động. Hỗ trợ cho ngữ nghĩa "mặc định", có sẵn kể từ khi phát hành Java 1.2, đã bị loại bỏ, bao gồm các đơn giản hóa để chạy trên các hệ thống có bộ đồng xử lý toán học x87 rất cũ (sau khi giới thiệu hướng dẫn SSE2, nhu cầu về ngữ nghĩa bổ sung đã biến mất).
  • Đã triển khai các loại giao diện mới cho trình tạo số giả ngẫu nhiên, cũng như triển khai các thuật toán bổ sung để tạo số ngẫu nhiên tốt hơn. Các ứng dụng có cơ hội chọn thuật toán tạo số giả ngẫu nhiên. Cải thiện hỗ trợ tạo luồng đối tượng ngẫu nhiên.
  • Đã thực hiện đóng gói mạnh mẽ bắt buộc đối với tất cả các phần bên trong JDK, ngoại trừ các API quan trọng như sun.misc.Unsafe. Các khối đóng gói mạnh cố gắng truy cập các lớp, phương thức và trường nội bộ từ mã. Trước đây, tính năng đóng gói nghiêm ngặt có thể bị vô hiệu hóa bằng cách sử dụng tùy chọn "--illegal-access=permit", nhưng điều này hiện đã không còn được dùng nữa. Các ứng dụng cần truy cập vào các lớp, phương thức và trường bên trong phải xác định rõ ràng chúng bằng cách sử dụng tùy chọn "--add-opens" hoặc thuộc tính Add-Opens trong tệp kê khai.
  • Các ứng dụng được cung cấp khả năng xác định các bộ lọc cho dữ liệu khử lưu huỳnh, có thể phụ thuộc vào ngữ cảnh và được chọn động cùng với các hoạt động khử lưu huỳnh nhất định. Các bộ lọc bạn đặt có thể áp dụng cho toàn bộ máy ảo (toàn JVM), tức là không chỉ bao gồm chính ứng dụng mà còn cả các thư viện của bên thứ ba được sử dụng trong ứng dụng.
  • Swing đã thêm phương thức javax.swing.filechooser.FileSystemView.getSystemIcon để tải các biểu tượng lớn nhằm cải thiện khả năng hiển thị giao diện người dùng trên màn hình có mật độ điểm ảnh cao (HighDPI).
  • API java.net.DatagramSocket cung cấp hỗ trợ để kết nối với các nhóm Multicast mà không cần API java.net.MulticastSocket riêng biệt.
  • Tiện ích IGV (Trình hiển thị đồ thị lý tưởng) đã được cải thiện, cung cấp trực quan hóa tương tác của biểu diễn mã trung gian trong trình biên dịch HotSpot VM C2 JIT.
  • Trong JavaDoc, bằng cách tương tự với trình biên dịch javac, khi xuất ra lỗi, số dòng có vấn đề trong tệp nguồn và vị trí của lỗi hiện được chỉ định.
  • Thuộc tính native.encoding đã được thêm vào, phản ánh tên của mã hóa ký tự hệ thống (UTF-8, koi8-r, cp1251, v.v.).
  • Giao diện java.time.InstantSource đã được thêm vào, cho phép bạn thao tác thời gian mà không bị ràng buộc với múi giờ.
  • Đã thêm API java.util.HexFormat để chuyển đổi sang biểu diễn hex và ngược lại.
  • Chế độ lỗ đen đã được thêm vào trình biên dịch, chế độ này vô hiệu hóa các hoạt động loại bỏ mã chết, có thể được sử dụng khi tiến hành kiểm tra hiệu suất.
  • Đã thêm tùy chọn "-Xlog:async" vào Thời gian chạy để ghi nhật ký không đồng bộ.
  • Khi thiết lập kết nối an toàn, TLS 1.3 được bật theo mặc định (TLS 1.2 trước đây đã được sử dụng).
  • API Applet không còn được dùng trước đây (java.applet.Applet*, javax.swing.JApplet), được sử dụng để chạy các ứng dụng Java trong trình duyệt, đã được chuyển sang danh mục được lên lịch xóa (mất tính liên quan sau khi kết thúc hỗ trợ cho Java plug-in cho trình duyệt).
  • Đã chuyển sang danh mục Trình quản lý bảo mật đã lên lịch xóa, danh mục này từ lâu đã mất đi tính liên quan và hóa ra là không có người nhận sau khi chấm dứt hỗ trợ cho trình cắm trình duyệt.
  • Cơ chế Kích hoạt RMI đã bị xóa, đã lỗi thời, được chuyển sang danh mục tùy chọn trở lại trong Java 8 và hầu như không bao giờ được sử dụng trong thực tế hiện đại.
  • Trình biên dịch thử nghiệm đã bị xóa khỏi SDK hỗ trợ JIT (vừa đúng lúc) để biên dịch động mã Java cho HotSpot JVM, cũng như chế độ biên dịch ưu tiên (AOT, trước thời hạn) của class thành mã máy trước khi khởi động máy ảo. Trình biên dịch được viết bằng Java và dựa trên công việc của dự án Graal. Cần lưu ý rằng việc duy trì trình biên dịch đòi hỏi rất nhiều lao động, điều này không hợp lý trong điều kiện thiếu nhu cầu của các nhà phát triển.

Nguồn: opennet.ru

Thêm một lời nhận xét