Backend

99 Ngày Java — Ngày 84: Text Block

SSite Admin
19 tháng 10, 2026 3 phút đọc 5 lượt xem
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.

Text Block

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 newline

2. 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 spaces

3. 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 preserved

4. 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

S

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.

Bài viết liên quan

99 Ngày Spring — Ngày 84: SSE và WebSocket

Server-Sent Events một chiều, STOMP trên WebSocket hai chiều, vận hành nhiều instance và cách chọn cho từng bài toán realtime.

19 thg 10, 20263 phút5
99 Ngày Spring — Ngày 83: R2DBC

Driver non-blocking, ReactiveCrudRepository, transaction reactive và những đánh đổi so với JPA.

18 thg 10, 20262 phút6
99 Ngày Java — Ngày 83: Sealed Classes

sealed và permits, ba lựa chọn của lớp con, switch đầy đủ không cần default và cách mô hình hóa domain.

18 thg 10, 20263 phút4