JavaRush /Blog Java /Random-VI /Java 14: có gì mới?

Java 14: có gì mới?

Xuất bản trong nhóm
Vấn đề của thế giới là vấn đề của thế giới và Java mới đang được triển khai đúng tiến độ. Nghĩa là, đúng sáu tháng một lần. Phiên bản phát hành của Java 14 được phát hành vào ngày 17 tháng 3 và giới thiệu một số cải tiến thú vị về ngôn ngữ nhắm đến các nhà phát triển. Java 14: có gì mới?  - 1Trong số đó có hỗ trợ thử nghiệm cho từ khóa bản ghi , hỗ trợ khớp mẫu trong toán tử " instanceof ", NullPointerExceptions thân thiện với người dùng hơn , "xem trước" mở rộng các khối văn bản , một công tắc mặc định được cập nhật và hơn thế nữa. Hãy để chúng tôi nhắc bạn rằng tất cả những đổi mới trong Java đều bắt đầu bằng các đề xuất mở rộng ( JEP, Đề xuất cải tiến Java ). Các nhà phát triển đề xuất các thay đổi, chúng được các cha mẹ Java “chính thức” xem xét và sau đó một số thay đổi đó được chấp nhận, sau đó chúng trở thành một phần của JDK. Và bây giờ - về mọi thứ theo thứ tự.

JEP 359: Hồ sơ

Các bản ghi, còn được gọi là Bản ghi, có sẵn cho JDK 14 ở chế độ xem trước và đây là một tính năng hoàn toàn mới đối với Java. Trên thực tế, chúng tôi có trước mắt một loại mới được phát triển trong dự án Valhalla . Bản ghi tương tự như bảng liệt kê và cho phép bạn đơn giản hóa mã của mình. Về cơ bản, chúng thay thế các lớp có trạng thái nhưng không có hành vi. Nói một cách đơn giản, có các trường, không có phương thức. Trong trường hợp các lớp, đôi khi chúng ta phải viết rất nhiều mã lặp đi lặp lại mà không phải lúc nào cũng cần thiết: hàm tạo, hàm truy cập, bằng(), hashCode(), toString(), v.v. Để tránh mã lặp lại này, các kế hoạch Java để sử dụng bản ghi. Đây là phiên bản cổ điển:
final class Triangle {
 	public final int x;
public final int y;
public final int z;

    public Triangle(int x, int y, int z) {
         this.x = x;
         this.y = y;
    this.z = z;
    }
    // equals, hashCode, toString
Hãy chuyển sang Java 14 và sử dụng bản ghi:
public record Triangle(int x, int y, int z){}
Đó là tất cả. Xin lưu ý rằng các bản ghi hiện tồn tại ở dạng xem trước, vì vậy để dùng thử trong thực tế, bạn cần tải xuống jdk14 và nhập lệnh:
javac —enable-preview —release 14 Triangle.java
Hồ sơ là các lớp, mặc dù có những hạn chế. Họ không thể mở rộng các lớp khác hoặc khai báo các trường (ngoại trừ phần cuối riêng tư tương ứng với các thành phần khai báo trạng thái). Hồ sơ là ngầm định cuối cùng và không thể trừu tượng. Các bản ghi khác với các lớp thông thường ở chỗ chúng không thể tách API khỏi phần trình bày của nó. Nhưng sự mất tự do được bù đắp bằng sự gia tăng độ chính xác. Các thành phần bản ghi cũng ngầm định là cuối cùng.

JEP 305: So khớp mẫu cho instanceof (Xem trước)

Tính năng Khớp mẫu , được giới thiệu trong bản xem trước của Java 14, được thiết kế để kết hợp việc kiểm tra loại đối tượng và chuyển đổi của nó trong toán tử instanceof . Nói cách khác, trước Java 14, chẳng hạn, đã có đoạn mã sau:
Object object = Violin;

if (object instanceof Instrument) {
    Instrument instrument = (Instrument) object;
    System.out.println(instrument.getMaster());
}
Như bạn có thể thấy, chúng ta phải truyền đối tượng tới lớp có các phương thức mà chúng ta muốn sử dụng. Giờ đây, Java 14 và tính năng Khớp mẫu được kết nối cho phép bạn giảm mã thành như sau:
Object object = Violin;

if (object instanceof Instrument instrument){
    System.out.println(instrument.getMaster());
}

JEP 343: Công cụ đóng gói (Vườn ươm)

JDK 8 có công cụ javapackager được thiết kế cho JavaFX. Tuy nhiên, sau khi tách JavaFX khỏi Java bằng việc phát hành JDK 11, javapackager phổ biến đã không còn khả dụng nữa. Javapackager là một công cụ đóng gói. Nó cho phép các ứng dụng Java được đóng gói theo cách mà chúng có thể được cài đặt giống như tất cả các chương trình “bình thường” khác. Ví dụ: tạo tệp exe cho người dùng Windows và khởi chạy ứng dụng Java như con người - chỉ bằng một cú nhấp chuột. Tất nhiên, rất thiếu một công cụ như vậy, vì vậy JEP 343 đã giới thiệu một công cụ mới, jpackage , đóng gói một ứng dụng Java vào một gói dành riêng cho nền tảng chứa tất cả các phụ thuộc cần thiết. Các định dạng gói được hỗ trợ cho một nền tảng cụ thể:
  • Linux: deb và vòng/phút
  • macOS: pkg và dmg
  • Windows: MSI và EXE

JEP 345: Phân bổ bộ nhớ nhận biết NUMA cho G1

JEP 345 chỉ phục vụ để triển khai hỗ trợ NUMA (Truy cập bộ nhớ không đồng nhất). Đây là những kiến ​​trúc truy cập bộ nhớ không đồng nhất, một cách thiết lập cụm bộ vi xử lý thành một hệ thống đa bộ xử lý trong đó bộ nhớ có thể được phân phối cục bộ: mỗi lõi bộ xử lý nhận được một lượng nhỏ bộ nhớ cục bộ, trong khi các lõi khác có quyền truy cập vào bộ nhớ đó. JEP 345 có kế hoạch trang bị cho bộ thu gom rác G1 khả năng tận dụng các kiến ​​trúc như vậy. Trong số những thứ khác, phương pháp này giúp cải thiện hiệu suất trên các máy rất mạnh.

JEP 349: Truyền phát sự kiện JFR

Java Flight Recorder (JFR) hiện là một phần của OpenJDK và do đó được cung cấp miễn phí. JDK 14 bổ sung một API để theo dõi nhanh chóng các sự kiện JFR (JDK Flight Recorder), đặc biệt để tổ chức giám sát liên tục các ứng dụng đang hoạt động và không hoạt động. Các sự kiện tương tự được ghi lại như đối với tùy chọn không phát trực tuyến, với chi phí hoạt động dưới 1%. Bằng cách này, các sự kiện sẽ được phát trực tuyến cùng lúc với tùy chọn không phát trực tuyến. Tuy nhiên, JEP 349 không được phép gọi lại đồng bộ cho người tiêu dùng tương ứng. Ngay cả dữ liệu từ các bản ghi được lưu trữ trong bộ nhớ trung gian cũng không thể truy cập được. Về mặt kỹ thuật, gói jdk.jfr.consumer trong mô-đun jdk.jfr sẽ được mở rộng với chức năng truy cập không đồng bộ vào các sự kiện.

JEP 352: Bộ đệm byte được ánh xạ không biến đổi

Như chúng ta đã biết, API tệp Java NIO (IO mới) đã xuất hiện kể từ JDK 1.4 và sau đó một cải tiến mới có tên Path đã được giới thiệu. Đường dẫn là một giao diện thay thế lớp java.io.File dưới dạng biểu diễn của một tệp hoặc thư mục khi chúng ta làm việc trong Java NIO. JEP 352 mở rộng MappedByteBuffer để tải một phần dữ liệu tệp vào bộ nhớ ổn định (NVM). Bộ nhớ máy tính này, trong đó dữ liệu sẽ không bị mất ngay cả khi tắt nguồn (thường được gọi là bộ nhớ chỉ đọc), được sử dụng để lưu trữ dữ liệu vĩnh viễn. Đề xuất nâng cao Java này cung cấp một mô-đun và lớp mới cho API JDK: mô-đun jdk.nio.mapmode, cung cấp các chế độ mới (READ_ONLY_SYNC, WRITE_ONLY_SYNC) để tạo bộ đệm byte được ánh xạ (MappedByteBuffer) tham chiếu NVM.

JEP 358: Ngoại lệ NullPointer hữu ích

NullPointerExceptions giờ đây sẽ thân thiện hơn với lập trình viên. Theo nghĩa là việc mô tả ngoại lệ sẽ có nhiều thông tin hơn trước. Điều này là do JVM đã được dạy để phân tích chính xác hơn các hướng dẫn mã byte của chương trình và nó có thể chỉ ra biến nào dẫn đến giá trị bằng 0. Giả sử chúng ta có mã:
a.getMessage().getUserInfo().getName()
Trong bất kỳ phiên bản Java mới nhất nào, chúng ta sẽ nhận được nhật ký lỗi thông thường, nhật ký này không trả lời câu hỏi ai chính xác là null:
Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:12)
Và đây là những gì Java 14 sẽ cung cấp cho bạn nếu bạn quyết định dùng thử tính năng xem trước này:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "UserInfo().getName()" because the return value of "Message().getUserInfo()" is null
	at Main.main(Main.java:12)
Chuỗi này dễ hiểu hơn nhiều và cho phép bạn khắc phục lỗi nhanh hơn nhiều.

JEP 361: Chuyển đổi biểu thức (Tiêu chuẩn)

Toán tử Switch cập nhật đã có sẵn trong Java 12 và 13 trước đó, nhưng chỉ ở dạng tính năng xem trước, tức là nó không được bật theo mặc định. Bây giờ trong JDK 14, mọi thứ đều hoạt động tốt. Java 14 giới thiệu một dạng đơn giản mới của khối chuyển đổi với nhãn case L -> .... Dạng mới giúp đơn giản hóa mã trong một số trường hợp. Dưới đây là một vài ví dụ. Giả sử chúng ta có một enum mô tả các ngày trong tuần. Chúng ta có thể viết mã cổ điển (tiền Java 14):
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}
Và đây là một tùy chọn sử dụng Java 14:
switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}
Bạn cũng có thể viết các khối nhiều dòng và trả về một giá trị bằng từ khóa năng suất mới:
int result = switch (s) {
    case "Working from Home" -> 1;
    case "Working from Office" -> 2;
    default    -> {
        System.out.println("Neither Home nor Office… Cafe? Car? Park?...");
        yield 0;
    }
};
Có một số điều quan trọng hơn cần lưu ý khi sử dụng switch mới . Đặc biệt, bạn cần nhớ rằng các lựa chọn phải đầy đủ. Nghĩa là, đối với tất cả các giá trị có thể có phải có nhãn chuyển đổi tương ứng. Vì năng suất hiện là một từ khóa nên có thể có một lớp có tên năng suất trong Java 14. Nói chung, nếu bạn muốn tìm hiểu cách sử dụng các công tắc đã cập nhật, hãy truy cập JEP 361 và nghiên cứu. Có rất nhiều thông tin thú vị ở đó.

JEP 362: Không dùng cổng Solaris và SPARC

Không chắc nhiều độc giả của chúng tôi còn nhớ về hệ điều hành Solaris . Hệ điều hành dựa trên UNIX này, do Sun Microsystems, cha mẹ của Java, tạo ra, được sử dụng chủ yếu cho các máy chủ trên kiến ​​trúc SPARC... Quá nhiều từ lạ trên mỗi cm vuông? Không có vấn đề gì lớn: JEP 362 kết thúc hỗ trợ cho các nền tảng Solaris/SPARC, Solaris/x64 và Linux/SPARC. Nghĩa là, các cổng của chúng hiện không được dùng nữa và trong tương lai rất có thể chúng sẽ bị xóa khỏi OpenJDK. Tuy nhiên, các phiên bản Java cũ hơn (trước JDK 14) liên quan đến các cổng Solaris/SPARC, Solaris/x64 và Linux/SPARC sẽ hoạt động mà không cần sửa đổi. Nếu bạn là người yêu thích lịch sử và quan tâm đến các công nghệ cách đây không xa, hãy truy cập Wikipedia và đọc về kiến ​​trúc SPARС .

JEP 363: Xóa Trình thu gom rác quét đánh dấu đồng thời (CMS)

Trình thu gom rác CMS (Quét đánh dấu đồng thời) được nhắm mục tiêu xóa vì hai năm trước nó bị đánh dấu là lỗi thời và không được bảo trì. Tuy nhiên, người dùng các phiên bản Java cũ hơn sử dụng CMS GC có thể ngừng hoạt động - mục đích của JEP này không phải là xóa trình tạo khỏi các bản phát hành JDK trước đó. Ngoài ra, sự kết hợp giữa thuật toán thu gom rác ParallelScavenge và SerialOld (chạy với tùy chọn "-XX:+UseParallelGC -XX:-UseParallelOldGC") đã không còn được dùng nữa.

JEP 364: ZGC trên macOSJEP 365: ZGC trên Windows

Có một công cụ thu gom rác thú vị tên là Z Garbage Collector (ZGC) . Nó hoạt động ở chế độ thụ động và cố gắng giảm thiểu độ trễ do thu gom rác: thời gian dừng khi sử dụng ZGC không vượt quá 10 ms. Nó có thể hoạt động với những đống nhỏ và những đống khổng lồ (những đống chiếm nhiều terabyte). JEP 364 và JEP 365 thực tế là anh em sinh đôi. JEP 364 mang Z Garbage Collector lên MacOS. Một phần của JEP cũng mô tả chức năng thu thập để giải phóng bộ nhớ thiết bị không sử dụng, như được chỉ định trong JEP 351 , điều này xảy ra với Java 13. Việc triển khai ZGC trên macOS bao gồm hai phần:
  • Hỗ trợ bộ nhớ đa ánh xạ trên macOS
  • Hỗ trợ ZGC để dự trữ bộ nhớ liên tục
JEP 365 cung cấp hỗ trợ cho ZGC đã có trên Windows và cả ở chế độ thử nghiệm. Nó như sau:
  • Hỗ trợ bộ nhớ đa bản đồ
  • Hỗ trợ ánh xạ bộ nhớ dựa trên tệp trang vào không gian địa chỉ dành riêng
  • Hỗ trợ ánh xạ và hủy ánh xạ các phần tùy ý của heap
  • Hỗ trợ cam kết và không cam kết các phần tùy ý của heap

JEP 366: Không dùng kết hợp ParallelScavenge + SerialOld GC

JEP này không dùng nữa sự kết hợp giữa các thuật toán thu gom rác song song và nối tiếp cũ. Sự kết hợp này phải được kích hoạt thủ công bằng cách sử dụng các tham số dòng lệnh -XX: + UseParallelGC -XX: -UseParallelOldGC. Các tác giả tin rằng sự kết hợp này rất đặc hiệu nhưng cũng đòi hỏi nỗ lực duy trì đáng kể. Vì vậy, bây giờ tùy chọn -XX: UseParallelOldGC không được dùng nữa và cảnh báo sẽ xuất hiện nếu được sử dụng.

JEP 367: Xóa Công cụ và API Pack200

Pack200 là một định dạng lưu trữ được tối ưu hóa để lưu trữ các tệp lớp Java đã biên dịch. Công cụ này đã được đánh dấu là không dùng nữa kể từ Java 11. Hiện tại, các công cụ API pack200, unpack200 và Pack200 đã được thông báo chính thức về việc xóa khỏi gói java.util.jar . Công nghệ này đã được giới thiệu trở lại trong Java 5 như một phương tiện xử lý băng thông rất hạn chế (modem, thật đáng sợ khi nói và nhớ, 56k) và không đủ dung lượng lưu trữ trên ổ cứng. Cách đây một thời gian, Java 9 đã giới thiệu các sơ đồ nén mới. Các nhà phát triển được khuyến khích sử dụng jlink .

JEP 368: Khối văn bản (Bản xem trước thứ hai)

Các khối văn bản xuất hiện lần đầu tiên trong Java 13. Chúng là các chuỗi ký tự nhiều dòng giúp ngăn chặn nhu cầu sử dụng hầu hết các chuỗi thoát, tự động định dạng chuỗi và cũng cho phép nhà phát triển định dạng chuỗi nếu cần. Tính năng hữu ích này hiện có sẵn trong Java 14 (Bản xem trước thứ 2). Mục đích chính của khối văn bản là cải thiện việc xử lý các ký tự nhiều dòng khó hiểu. Điều này giúp đơn giản hóa đáng kể việc đọc và ghi các truy vấn SQL, mã HTML và XML cũng như JSON. Ví dụ HTML không có khối văn bản:
String html = "<html>\n" +
              "    <body>\n" +
              "        <p>Hello, JavaRush Student</p>\n" +
              "    </body>\n" +
              "</html>\n";
Cách thể hiện tương tự với các khối văn bản:
String html = """
              <html>
                  <body>
                      <p>Hello, JavaRush Student</p>
                  </body>
              </html>
              """;
Dấu phân cách mở là một chuỗi gồm ba ký tự dấu ngoặc kép ("" "), theo sau là 0 hoặc nhiều dấu cách và sau đó là dấu phân cách dòng. Nội dung bắt đầu ở ký tự đầu tiên sau dấu phân cách dòng của dấu phân cách mở. Dấu phân cách đóng là một chuỗi gồm ba ký tự trích dẫn kép " _ ) đã được chọn để các ký tự có thể được hiển thị mà không cần thoát và cũng có thể phân biệt trực quan một khối văn bản với một chuỗi ký tự. Vào đầu năm 2019, JEP 355 đã đề xuất các khối văn bản như một phần tiếp theo của JEP 326 (Chuỗi ký tự thô), nhưng chúng đã bị rút lại. Cuối năm đó, JDK 13 đã giới thiệu tính năng xem trước khối văn bản và bây giờ Java 14 đã bổ sung thêm hai chuỗi thoát mới. Đây là dấu kết thúc dòng, ký hiệu là \ và dấu thứ hai dành cho khoảng trắng đơn, ký hiệu là /s. Một ví dụ về việc sử dụng dòng mới không có khối văn bản:
String literal = "This is major Tom to Ground Control " +
"I am stepping through the door... " +
"Wait… What???";
Và bây giờ với chuỗi thoát \<line-terminator>:
String text = """
                This is major Tom to Ground Control \
                I am stepping through the door... \
                WaitWhat???\
                """;
Trình tự thoát \s được sử dụng để giải thích khoảng trắng ở cuối, theo mặc định, trình biên dịch sẽ bỏ qua. Nó bảo tồn tất cả khoảng trắng trước nó. Ví dụ:
String text1 = """
               line1
               line2 \s
               line3
               """;

String text2 = "line1\nline2 \nline3\n";
text1text2giống hệt nhau.

JEP 370: API truy cập bộ nhớ ngoài (Vườn ươm)

Nhiều thư viện và chương trình Java phổ biến có quyền truy cập vào bộ nhớ ngoài. Ví dụ: API Ignite, MapDB, Memcached và Netty ByteBuf. Khi làm như vậy, họ có thể tránh được chi phí và tính không thể đoán trước liên quan đến việc thu thập rác (đặc biệt là khi cung cấp bộ đệm lớn), chia sẻ bộ nhớ trên nhiều quy trình cũng như tuần tự hóa và giải tuần tự hóa nội dung bộ nhớ bằng cách ánh xạ các tệp trong bộ nhớ (ví dụ: sử dụng mmap). Tuy nhiên, Java API vẫn chưa có giải pháp phù hợp để truy cập bộ nhớ ngoài. JDK 14 bao gồm bản xem trước của API truy cập bộ nhớ ngoài , cho phép các ứng dụng Java truy cập các vùng bộ nhớ bên ngoài vùng nhớ JVM một cách an toàn và hiệu quả bằng cách sử dụng các bản tóm tắt MemorySegment, MemoryAddress và MemoryLayout mới.

kết luận

Vậy bạn nghĩ như thế nào? So với Java 13, Java 14 mới cung cấp nhiều cải tiến quan trọng hơn trong nhiều lĩnh vực. Rất có thể, điều quan trọng nhất đối với các nhà phát triển sẽ là công tắc được cập nhật, các ngoại lệ mở rộng NullPointerExceptions và các bản ghi. Hay không?.. Đừng quên dùng thử các tính năng mới của Java 14, nó rất hữu ích ngay cả với những người mới bắt đầu. Chúc may mắn với các nghiên cứu của bạn!
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION