99 Ngày Java — Ngày 84: Text Block
Nhúng JSON hay SQL vào chuỗi Java từng là một hàng dấu cộng, \n và dấu nháy bị escape. Text block, ổn định từ Java 15, cho phép viết chuỗi nhiều dòng đúng như hình dạng thật của nó. Kết quả vẫn là một String bình thường, nên điểm cần hiểu chỉ là compiler xử lý xuống dòng và thụt lề thế nào.

1. Cú pháp: ba dấu nháy rồi xuống dòng
Text block mở bằng ba dấu nháy kép và bắt buộc xuống dòng ngay sau đó; nội dung bắt đầu từ dòng kế tiếp. Dấu nháy kép bên trong không cần escape. Kết thúc dòng luôn được chuẩn hóa thành \n dù file nguồn dùng kiểu xuống dòng của Windows. Vị trí dấu đóng quyết định chuỗi có kết thúc bằng \n hay không.
String json = """
{
"id": 42,
"status": "PAID"
}
"""; // ends with a newline
String inline = """
SELECT 1"""; // no trailing newline2. Thụt lề: compiler bỏ phần chung
Compiler tìm dòng thụt lề ít nhất, tính cả dòng chứa dấu đóng, rồi bỏ đúng ngần ấy khoảng trắng ở đầu mọi dòng. Nhờ vậy bạn thụt text block theo code xung quanh mà chuỗi không dính thụt lề đó. Kéo dấu đóng sang trái là cách chủ động giữ lại thụt lề. Khoảng trắng cuối dòng cũng bị bỏ. Đừng trộn tab với dấu cách: mỗi ký tự được đếm là một.
String a = """
line one
line two
"""; // "line one\nline two\n"
String b = """
line one
line two
"""; // each line keeps 4 leading spaces3. Hai escape mới
Dấu gạch chéo ngược ở cuối dòng nối dòng đó với dòng sau, hữu ích khi muốn bẻ một câu dài trong mã nguồn mà chuỗi vẫn là một dòng. \s là một dấu cách không bị bỏ, dùng khi cần giữ khoảng trắng cuối dòng. Các escape cũ như \t và \" vẫn dùng được; chỉ cần escape dấu nháy khi có ba dấu liền nhau trong nội dung.
String message = """
Order received. We will email you \
when it ships.
"""; // a single line plus the final newline
String padded = """
id \s
name \s
"""; // trailing spaces preserved4. JSON, SQL và giá trị động
Text block là hằng chuỗi lúc biên dịch: nó dùng được trong annotation và được chia sẻ trong String pool như literal thường. Không có nội suy; muốn chèn giá trị thì dùng formatted(). Cách đó ổn cho thông điệp và dữ liệu test, nhưng tuyệt đối không dùng để ghép dữ liệu người dùng vào SQL. Text block chỉ làm câu SQL dễ đọc; chống injection vẫn là việc của tham số ràng buộc.
JSON mẫu trong test, câu SQL, đoạn HTML hoặc YAML nhỏ là chỗ hợp nhất.
Chuỗi một dòng ngắn thì literal thường vẫn rõ hơn.
Với JSON thật, hãy tạo bằng thư viện để được escape đúng.
String sql = """
SELECT id, total
FROM orders
WHERE customer_id = ? AND status = ?
ORDER BY created_at DESC
""";
try (var statement = connection.prepareStatement(sql)) {
statement.setString(1, customerId);
statement.setString(2, "PAID");
}Text block trả lại hình dạng thật cho chuỗi nhiều dòng; quy tắc cần nhớ là dòng thụt ít nhất quyết định lề. Ngày 85 nhìn ở tầm lớn hơn nhiều: module system của Java.
Tài liệu đối chiếu
https://openjdk.org/jeps/378
https://docs.oracle.com/en/java/javase/21/text-blocks/index.html
Site Admin
Engineer and writer. Building things with TypeScript and distributed systems.
Bình luận (0)
Bạn cần đăng nhập bằng Google để bình luận.
Hãy là người bình luận đầu tiên.


