JavaRush /Blog Java /Random-VI /Java 13: Tính năng mới

Java 13: Tính năng mới

Xuất bản trong nhóm
Chúng ta đã quen với việc sáu tháng một lần lại có một bản phát hành JDK mới. Cho đến nay, cách tiếp cận này đã tự chứng minh và nỗi lo lắng của một số nhà phát triển rằng họ sẽ không theo kịp các bản cập nhật là vô ích: có rất ít thay đổi trong sáu tháng và chúng không mang tính toàn cầu như trước. Chà, những lập trình viên mới vào nghề có thể không nhận thấy sự đổi mới nào cả. Java 13: tính năng mới - 1Tuy nhiên, tốt hơn hết là các nhà phát triển phần mềm trong tương lai nên theo kịp những đổi mới. Trong bài viết này, chúng tôi sẽ mô tả các đề xuất mở rộng được chấp nhận (JEP) theo truyền thống. Java 13 chỉ bao gồm 5 JEP và 76 thành phần thư viện cốt lõi mới (trong đó gần một nửa là các phần bổ sung đơn giản cho gói java.io).

JEP 355 : Khối văn bản (Xem trước)

Hãy bắt đầu bằng cách thay đổi cú pháp của ngôn ngữ. Điều quan trọng nhất trong số đó là các khối văn bản. Chúng cho phép bạn tránh thoát ký tự và biết cách định dạng chuỗi. Bạn có thể nhớ rằng JDK 12 không bao gồm tính năng Chuỗi ký tự thô (JEP 326) dự kiến ​​​​để làm việc với chuỗi ký tự. Trong Java 13, nó được thay thế bằng JEP 355 bằng các khối văn bản. Bạn có thể nhớ rằng trong Java, một chuỗi được bao bọc trong dấu ngoặc kép. Điều này là tốt, nhưng vấn đề là một dòng không thể chiếm nhiều hơn một dòng của tệp nguồn (để tránh nhầm lẫn với một dòng Java, ở đây chúng ta sẽ gọi một dòng tệp là “dòng”). Chà, hãy cùng tìm hiểu và sử dụng, ví dụ: biểu tượng \nnếu cần ngắt hoặc nối các biểu thức nhiều dòng. Nó không diễn ra tốt đẹp lắm! Các văn bản có chứa các đoạn HTML, XML, SQL hoặc JSON được nhúng đặc biệt cồng kềnh. Tất cả việc thoát, nối và chỉnh sửa thủ công này làm cho mã trở nên bất tiện khi viết và khó đọc. Khối văn bản cố gắng giải quyết vấn đề này. Họ bắt đầu ừ... với ba dấu ngoặc kép và kết thúc bằng chúng (tôi biết, nghe có vẻ không hay lắm). Mọi thứ giữa dấu ngoặc kép được hiểu là một phần của dòng, bao gồm cả dòng mới. Các khối văn bản có thể được sử dụng giống hệt như các ký tự văn bản tiêu chuẩn và Java sẽ biên dịch mã theo cách tương tự. Dấu ngoặc kép mở đầu phải được theo sau bởi dấu phân cách dòng; khối văn bản không thể được sử dụng trong một dòng, vì vậy mã
String smallBlock = """Only one line""";
sẽ dẫn đến các lỗi sau:
TextBlock.java:3: error: illegal text block open delimiter sequence, missing line terminator
   String smallBlock = """Text Block""";
                          ^
TextBlock.java:3: error: illegal text block open delimiter sequence, missing line terminator
   String smallBlock = """Text Block""";
                                   	^
Một đoạn HTML đơn giản bây giờ có thể được viết như thế này:
String htmlBlock = """
               	<html>
                 	<body>
                   	<p>CodeGym Web page</p>
                 	</body>
               	<html>
         	     """;
Hãy đề cập đến một số điểm tinh tế mà bạn nên lưu ý hơn khi sử dụng khối văn bản. Vị trí của dấu ngoặc kép đóng hóa ra rất quan trọng: nó quyết định cách xử lý khoảng trắng không thường xuyên. Trong ví dụ trên, dấu ngoặc kép đóng được căn chỉnh theo mức thụt lề của văn bản HTML. Trong trường hợp này, trình biên dịch sẽ loại bỏ các khoảng trống thụt đầu dòng và kết quả là chúng ta sẽ nhận được một dòng như thế này:
<html>
  <body>
    <p>My web page</p>
  </body>
</html>
Ghi chú:một dòng như vậy sẽ chứa một dòng mới ở cuối dòng. Nếu không cần thiết, có thể đặt dấu ngoặc kép đóng “”” ngay sau thẻ </html>. Nếu chúng ta di chuyển dấu ngoặc kép đến gần lề trái hơn, điều này sẽ thay đổi mức độ thụt lề bị loại bỏ. Nếu chúng ta di chuyển chúng sang bên trái hai khoảng trắng, chúng ta sẽ thêm hai khoảng trắng để thụt lề vào mỗi dòng. Di chuyển sang cạnh trái sẽ khiến tất cả phần đệm được giữ nguyên. Di chuyển dấu ngoặc kép sang bên phải sẽ không có tác dụng và sẽ không thêm bất kỳ vết lõm nào nữa. Các khối văn bản đã được đưa vào JDK 13 dưới dạng tính năng xem trước. Điều này có nghĩa là chúng chưa được đưa vào đặc tả ngôn ngữ Java tương ứng. Nghĩa là, không rõ liệu tính năng này sẽ trở thành một phần vĩnh viễn của ngôn ngữ hay nó chỉ là khách ở đây. Hiện tại, các nhà phát triển có thể thử nghiệm tính năng này và đưa ra ý kiến ​​của mình về nó. Số phận của các khối văn bản sẽ phụ thuộc vào nó: tính năng này có thể được cải thiện và nếu bạn không thích nó, thì nó có thể bị xóa hoàn toàn. Nếu bạn muốn thử các khối văn bản trong thực tế, hãy nhớ rằng các tính năng xem trước phải được đưa vào một cách rõ ràng để biên dịch và chạy. Biên soạn:

javac --enable-preview --release 13 TextBlock.java
Để chạy ứng dụng, bạn cần bật tính năng xem trước:

java --enable-preview TextBlock
Lớp này Stringcó ba phương thức mới bổ sung cho sự thay đổi ngôn ngữ này:
  • formatted(): Định dạng một chuỗi sử dụng chính chuỗi đó làm chuỗi định dạng. Tương đương với một thử tháchformat(this, args)
  • stripIndent(): Loại bỏ các khoảng trắng ngẫu nhiên khỏi một chuỗi. Điều này rất hữu ích nếu bạn đang đọc các chuỗi nhiều dòng và muốn áp dụng cùng một loại trừ khoảng trắng như với một khai báo rõ ràng.
  • translateEscapes(): Trả về một chuỗi có các chuỗi thoát (chẳng hạn như \ r), được dịch sang giá trị Unicode thích hợp.
Điều thú vị là những phương pháp này mới xuất hiện nhưng đã được đánh dấu là không dùng nữa ... tình trạng này cho thấy rằng chúng có thể bị xóa trong phiên bản tương lai của JDK. Có vẻ hơi lập dị khi thêm một phương thức mới và ngay lập tức từ bỏ nó. Tuy nhiên, xin lưu ý rằng những phương pháp này được liên kết với một tính năng xem trước có thể được thay đổi hoặc xóa. Có lẽ việc giới thiệu một chú thích @PreviewFeaturesẽ giúp giải quyết những tình huống như vậy, nhưng nó vẫn chưa được đưa vào JDK (mặc dù có khả năng cao là nó sẽ xuất hiện trong JDK 14).

JEP 354 : Chuyển biểu thức (Xem trước)

Java 12 đã giới thiệu một đề xuất về một hình thức viết biểu thức mới bằng câu lệnh switch - JEP 325 . Hóa ra đây là tính năng xem trước đầu tiên và số phận của nó chứng tỏ rằng việc gửi đề xuất cho người dùng là một ý tưởng tuyệt vời. Trước JDK 12, switchnó chỉ có thể được sử dụng như một câu lệnh thực hiện một hành động nhưng không trả về kết quả. Nhưng trong Java 12, nó cho phép sử dụng nó switchnhư một biểu thức trả về kết quả có thể được gán cho một biến. Có những thay đổi khác về cú pháp của các câu lệnh tình huống trong switch. Hãy xem một ví dụ từ JEP để hiểu cách thức hoạt động của nó.
int numberOfLetters;
switch(dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
    numberOfLetter = 6;
    break;
  case TUESDAY
    numberOfLetter = 7;
    break;
  case THURSDAY
  case SATURDAY
    numberOfLetter = 8;
    break;
  case WEDNESDAY
    numberOfLetter = 9;
    break;
  default:
   throw new IllegalStateException("Huh?: " + day);
}
Trong ví dụ này, chúng tôi sử dụng giá trị dayOfWeekđể gán giá trị cho numberOfLetters. Do đặc thù công việc của người vận hành switchnên mã này không đẹp và dễ mắc lỗi. Đầu tiên, nếu chúng ta quên áp dụng một câu lệnh breakcho từng nhóm nhãn trường hợp, chúng ta sẽ mặc định áp dụng cho nhóm nhãn trường hợp tiếp theo. Điều này có thể dẫn đến những lỗi khó tìm thấy. Thứ hai, chúng ta phải xác định từng nhóm nhãn trường hợp. Tất nhiên, nếu chúng ta quên, chúng ta sẽ gặp lỗi trình biên dịch, nhưng tùy chọn này cũng không lý tưởng. Mã của chúng tôi cũng khá dài dòng vì mỗi giá trị dayOfWeekphải có nhãn chữ hoa chữ thường riêng. Sử dụng cú pháp mới, chúng tôi nhận được mã sạch hơn và ít xảy ra lỗi hơn:
int numberOfLetters = switch (dayOfWeek) {
   case MONDAY, FRIDAY, SUNDAY -> 6;
   case TUESDAY -> 7;
   case THURSDAY, SATURDAY -> 8;
   case WEDNESDAY -> 9;
   default -> throw new IllegalStateException("Huh?: " + day);
};
Bây giờ chúng ta chỉ cần thực hiện phép gán một lần (từ switchgiá trị trả về của biểu thức) và có thể sử dụng danh sách được phân tách bằng dấu phẩy cho nhãn chữ hoa. Và vì chúng tôi không sử dụng toán tử breaknên chúng tôi loại bỏ các vấn đề liên quan đến nó. Cú pháp biểu thức switchcho phép chúng ta sử dụng cú pháp kiểu cũ hơn, vì vậy trong JDK 12 chúng ta có thể viết nó như thế này:
int numberOfLetters = switch (dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
   break 6;
  case TUESDAY
   break 7;
  case THURSDAY
  case SATURDAY
   break 8;
  case WEDNESDAY
   break 9;
  default:
   throw new IllegalStateException("Huh?: " + day);
};
Theo cộng đồng Java, việc sử dụng nạp chồng breakđể chỉ định giá trị trả về có thể gây nhầm lẫn. Ngôn ngữ Java cũng cho phép bạn sử dụng break( và continue) với một nhãn giống như toán tử nhảy vô điều kiện goto. JEP 354 đã thay đổi cách sử dụng này break, vì vậy trong Java 13, mã của chúng tôi thay đổi một chút:
int numberOfLetters = switch (dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
   yield 6;
  case TUESDAY
   yield 7;
  case THURSDAY
  case SATURDAY
   yield 8;
  case WEDNESDAY
   yield 9;
  default:
   throw new IllegalStateException("Huh?: " + day);
};
Ba JEP tiếp theo được liên kết với Máy ảo Java.

Lưu trữ CDS động JEP 350

Tiện ích mở rộng này cho phép bạn lưu trữ động các lớp khi kết thúc quá trình thực thi ứng dụng Java. CDS hoặc Chia sẻ dữ liệu lớp cho phép bạn đóng gói tất cả các lớp được khởi chạy khi khởi động vào một kho lưu trữ đặc biệt class data sharing, sử dụng danh sách các lớp tương tự này theo mặc định. Điều này dẫn đến khả năng tăng tốc đáng kể trong việc khởi chạy ứng dụng và tiết kiệm RAM. Trước đây, việc sử dụng AppCDS là một quy trình gồm nhiều bước bao gồm việc tạo danh sách các lớp có liên quan và sử dụng danh sách đó để tạo một kho lưu trữ sẽ được sử dụng cho các lần chạy tiếp theo. Bây giờ tất cả những gì cần thiết là một lần khởi chạy ứng dụng với cờ -XX: ArchiveClassesAtExitcho biết vị trí nơi kho lưu trữ sẽ được ghi. Với cách tiếp cận này, các lớp sẽ tự động được đóng gói vào kho lưu trữ sau khi ứng dụng bị dừng bình thường.

JEP 351 ZGC : Hủy cam kết bộ nhớ không sử dụng

Một năm trước, JDK 11 đã giới thiệu ZGC, một trình thu gom rác thử nghiệm, có thể mở rộng và có độ trễ thấp. Lúc đầu, ZGC hoạt động khá kỳ lạ: nó không cho phép trả lại bộ nhớ cho hệ điều hành, ngay cả khi nó không còn cần thiết nữa. Đối với một số môi trường, chẳng hạn như vùng chứa, nơi nhiều dịch vụ sử dụng tài nguyên cùng lúc, điều này có thể hạn chế khả năng mở rộng và hiệu quả của hệ thống. Vùng ZGC bao gồm cái gọi là ZPages. Khi các ZPage bị xóa trong chu trình thu gom rác, chúng sẽ được trả về ZPageCache. Các ZPage trong bộ đệm này được sắp xếp theo mức độ chúng được sử dụng gần đây. Trong Java 13, ZGC sẽ trả về hệ điều hành những trang được xác định là không được sử dụng trong một thời gian dài. Bằng cách này, chúng có thể được tái sử dụng cho các quy trình khác.

JEP 353 Triển khai lại API socket cũ

Cả hai cách triển khai API vẫn java.net.Socketjava.net.ServerSocketJDK 1.0. Trong phiên bản này và tất cả các JDK tiếp theo, việc triển khai các API này sử dụng một số kỹ thuật (chẳng hạn như sử dụng ngăn xếp luồng làm bộ đệm I/O) khiến chúng không linh hoạt và khó bảo trì. Để giải quyết vấn đề này, một triển khai mới đã được cung cấp trong JDK 13 NioSocketImpl. Nó không còn yêu cầu mã gốc nữa, giúp việc chuyển sang các nền tảng khác nhau dễ dàng hơn. Lớp này cũng sử dụng cơ chế bộ đệm đệm hiện có (tránh sử dụng ngăn xếp luồng cho mục đích này) và khóa java.util.concurrentthay vì các phương thức được đồng bộ hóa. Điều này sẽ đơn giản hóa việc tích hợp với các sợi từ Project Loom .

API mới

Chúng tôi đã đề cập trước đó rằng Java 13 bao gồm 76 API mới trong thư viện lớp cơ sở. Chúng bao gồm các lĩnh vực sau:
  • Cập nhật hỗ trợ Unicode.
  • Ba phương pháp mới Stringđể hỗ trợ các khối văn bản (xem mô tả JEP 255 ở trên).
  • Các lớp java.niobây giờ có tuyệt đối (ngược lại với tương đối) get thiết lập các phương pháp. Chúng, giống như lớp trừu tượng cơ sở Buffer, bao gồm một phương thức slice()để truy xuất một phần bộ đệm.
  • Phương thức force()lớp MappedByteBufferbuộc một phần bộ đệm phải được ghi vào bộ nhớ đệm của nó.
  • nio.FileSystemthêm ba biểu mẫu quá tải mới newFileSystem()để truy cập nội dung của tệp dưới dạng hệ thống tệp.
  • Một phương pháp thú vị mới đã javax.annotation.processing.ProcessingEnvironmentxuất hiện. isPreviewEnabled(). Nó sẽ cho bạn biết liệu các tính năng xem trước có được bật hay không. Điều này thật thú vị vì chú thích được đề cập ở trên @PreviewFeaturesẽ không có sẵn cho đến khi JDK 14 được phát hành.
  • DocumentBuilderFactorySAXParserFactorynhận javax.xml.parsersba phương thức mới để tạo các phiên bản nhận biết không gian tên.
Tài liệu này dựa trên một bài viết của Simon Rittertài liệu chính thức .
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION