Ngày 09 tháng 8 năm 2024 - Máy tính
Bài viết này sẽ tập trung xem xét các tính năng chính mà Java 11 đã giới thiệu.
1. Giao Diện Mới Cho Khách Hàng HTTP
Java 11 đã ra mắt giao diện khách hàng HTTP mới (bao gồm ba lớp chính là HttpClient
, HttpRequest
và HttpResponse
) nhằm thay thế API HttpURLConnection
hiện tại.
API HttpURLConnection
hiện tại tồn tại nhiều vấn đề:
-
Thiết Kế Cũ
Thiết kế của nó đã xem xét nhiều giao thức, nhưng một số giao thức này giờ đã không còn hiệu lực (như ftp, gopher, v.v.). -
Không Hỗ Trợ Đặc Điểm Web Hiện Đại
API chỉ hỗ trợ HTTP/1.1, không hỗ trợ HTTP/2 hay WebSocket. -
Không Có Bộ Quản Lý Kết Nối
Không có khả năng quản lý kết nối thông qua bộ nhớ đệm. -
Khó Sử Dụng
API phức tạp, yêu cầu nhà phát triển phải xử lý Rik68 Club Game Bài Tiền Thật dòng đầu vào và đầu ra thủ công cũng như giải quyết lỗi một cách cồng kềnh. -
Hiệu Suất Thấp
Làm việc theo chế độ đồng bộ (một luồng xử lý một yêu cầu và phản hồi), không hỗ trợ chế độ bất đồng bộ. -
Không An Toàn Với Đa Luồng
LớpHttpURLConnection
không bất biến và không an toàn với đa luồng.
Do đó, Java 11 đã giới thiệu giao diện khách hàng HTTP mới để thay thế HttpURLConnection
. So với HttpURLConnection
, API mới có những ưu điểm sau:
-
Thiết Kế Giao Diện Đơn Giản
Cung cấp giao diện lập trình đơn giản hơn (cho phép gọi chuỗi, giúp xây dựng và gửi yêu cầu dễ dàng hơn). -
Hỗ Trợ HTTP/2
Hầu hết các đặc điểm của HTTP/2 đều được hỗ trợ, bao gồm đa plexing, cải thiện hiệu suất và hiệu quả. -
Hỗ Trợ Đồng Bộ Và Bất Đồng Bộ
Đồng thời hỗ trợ cả hai phương thức truyền dữ liệu, cho phép linh hoạt trong việc sử dụng. -
Hỗ Trợ WebSocket
Cho phép thiết lập kết nối lâu dài và giao tiếp hai chiều. -
Cơ Chế Xử Lý Lỗi Cải Tiến
Khi yêu cầu HTTP thất bại, có thể hiểu rõ nguyên nhân thông qua cơ chế ngoại lệ.
Dưới đây là một ví dụ đơn giản:
// src/main/java/NewHTTPClientAPITest.java
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.concurrent.CompletableFuture;
public class NewHTTPClientAPITest {
public static void main(String[] args) throws IOException, InterruptedException {
// Xây dựng đối tượng HttpClient với thời gian chờ 1 phút
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofMinutes(1))
.build();
// Xây dựng đối tượng HttpRequest với URI và phương thức GET
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.GET()
.build();
// Yêu cầu đồng bộ và in nội dung phản hồi
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
// Yêu cầu bất đồng bộ và xử lý phản hồi
CompletableFuture<HttpResponse<String>> futureResponse = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
futureResponse.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();
}
}
Trong ví dụ trên, chúng ta đã tạo một đối tượng HttpClient
, xây dựng một yêu cầu HttpRequest
, và gửi yêu cầu này bằng cách sử dụng cả hai phương thức đồng bộ và bất đồng bộ.
2. Cải Tiến String API
Java 11 đã cải tiến API của lớp String
bằng cách thêm các phương thức sau:
-
isBlank()
Phương thức này kiểm tra xem chuỗi có phải là chuỗi rỗng hay không, nếu đúng thì trả vềtrue
. -
lines()
Phương thức này chia chuỗi thành các dòng và trả về dưới dạngStream
. -
strip()
,stripLeading()
,stripTrailing()
Loại bỏ khoảng trắng ở đầu và cuối chuỗi (hoặc chỉ ở đầu hoặc cuối tùy chọn). -
repeat(int)
Lặp lại chuỗi một số lần nhất định.
Ví dụ minh họa:
// src/main/java/StringAPIEnhancementsTest.java
import java.util.stream.Collectors;
public class StringAPIEnhancementsTest {
public static void main(String[] args) {
// Sử dụng isBlank()
System.out.println(" \n\t ".isBlank()); // true
// Sử dụng lines()
System.out.println("Hello\nWorld!".lines().collect(Collectors.joining(", "))); // Hello, World!
// Sử dụng strip()
System.out.println(" \n\t\n\r Xin chào, thế giới! ".strip()); // Xin chào, thế giới!
// Sử dụng stripLeading()
System.out.println(" \n\t\n\r Xin chào, thế giới! ".stripLeading()); // Xin chào, thế giới!
// Sử dụng stripTrailing()
System.out.println(" \n\t\n\r Xin chào, thế giới! ".stripTrailing()); // \n\t\n\r Xin chào, thế giới!
// Sử dụng repeat()
System.out.println("Xin chào!".repeat(2)); // Xin chào!Xin chào!
}
}
3. Cải Tiến Files API
Java 11 đã cải tiến API của lớp Files
bằng cách thêm các phương thức tĩnh sau:
-
readString()
Đọc nội dung của tệp văn bản và trả về dưới dạng chuỗi. -
writeString()
Ghi chuỗi vào tệp.
Ví dụ minh họa:
// src/main/java/FilesAPIEnhancementsTest.java
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.charset.StandardCharsets;
public class FilesAPIEnhancementsTest {
public static void main(String[] args) throws IOException {
Path path = Paths.get("test.txt");
// Sử dụng readString()
System.out.println(Files.readString(path, StandardCharsets.UTF_8)); // Nội dung tệp test.txt
// Sử dụng writeString()
Files.writeString(path, "Xin chào, thế giới!", StandardCharsets.UTF_8);
}
}
4. Cú Pháp Biến Địa Phương Trong Lambda
Từ Java 11, bạn có thể sử dụng từ khóa var
để xác định kiểu của tham số trong biểu thức lambda.
Ví dụ minh họa:
// src/main/java/LocalVariableSyntax4LambdaParametersTest.java
import java.util.function.BiFunction;
import java.util.function.Function;
public class LocalVariableSyntax4LambdaParametersTest {
public static void main(String[] args) {
// Biểu thức lambda trước Java 11
Function<String, String> toUpperCase = (String s) -> s.toUpperCase();
// Biểu thức lambda với cú pháp var trong Java 11
Function<String, String> toUpperCase2 = (var s) -> s.toUpperCase();
// Kết hợp [888bets](https://www.kongken.com) với chú thích
BiFunction<Integer, Integer, Integer> sum = (@NonNull var a, @NonNull var b) -> a + b;
}
}
5. Phương Thức toArray()
Mới Trong Collection
Java 11 đã bổ sung phương thức toArray(IntFunction<T[]> generator)
để chuyển đổi tập hợp thành mảng.
Ví dụ g88.vin minh họa:
// src/main/java/CollectionEnhancementsTest.java
import java.util.Arrays;
import java.util.List;
public class CollectionEnhancementsTest {
public static void main(String[] args) {
// Sử dụng phương thức toArray() mới
String[] names = List.of("Larry", "Jacky", "Alice").toArray(String[]::new);
}
}
6. Cải Tiến Lớp Optional
Java 11 đã thêm phương thức isEmpty()
vào lớp Optional
để kiểm tra xem giá trị bên trong có phải là null hay không.
Ví dụ minh họa:
// src/main/java/OptionalEnhancementsTest.java
import java.util.Optional;
public class OptionalEnhancementsTest {
public static void main(String[] args) {
Optional<String> optional = Optional.empty();
if (optional.isEmpty()) {
System.out.println("Optional trống");
}
}
}
7. Kiểm Soát Truy Cập Dựa Trên Nhúng
Java 11 đã cải tiến cách kiểm soát truy cập giữa các lớp nhúng, loại bỏ nhu cầu về các phương thức cầu nối do biên dịch viên tạo ra.
8. Epsilon: Bộ Thu Rác Không Hoạt Động
Java 11 đã giới thiệu bộ thu rác thử nghiệm Epsilon, không thực hiện thu gom rác thực tế.
9. ZGC: Bộ Thu Rác Độ Trễ Thấp
Java 11 cũng giới thiệu ZGC, một bộ thu rác độ trễ thấp dành riêng cho nền tảng Linux/x64.
10. Máy Ghi Cháy
Java 11 giới thiệu “Máy Ghi Cháy” để ghi lại và phân tích sự kiện khi ứng dụng chạy.
11. Phân Tích Đống Hiệu Quả Cao
Java 11 cung cấp khả năng phân tích đống với chi phí thấp hơn.
12. Chạy Chương Trình Từ File Nguồn Đơn Nhất
Java 11 cho phép chạy chương trình trực tiếp từ file nguồn duy nhất mà không cần biên dịch trước.
13. Hằng Số Động Trong Tập Tin Lớp
Java 11 giới thiệu cơ chế hằng số động để tăng tính linh hoạt và hiệu suất.
14. Hỗ Trợ TLS 1.3
Java 11 hỗ trợ giao thức TLS 1.3 để tăng cường bảo mật và hiệu suất.