Dự án Valhalla của Java chính thức có bản xem trước trong JDK 28
Oracle xác nhận JEP 401 (Value Classes) thuộc Project Valhalla sẽ được tích hợp vào OpenJDK cho JDK 28. Tuy nhiên, kiến trúc sư Brian Goetz cảnh báo các nhà phát triển rằng tính năng này có thể vẫn ở trạng thái preview trong bản LTS tiếp theo.

Dự án Valhalla của Java chính thức có bản xem trước trong JDK 28
Oracle xác nhận JEP 401 (Value Classes) thuộc Project Valhalla sẽ được tích hợp vào OpenJDK cho JDK 28. Tuy nhiên, kiến trúc sư Brian Goetz cảnh báo các nhà phát triển rằng tính năng này có thể vẫn ở trạng thái preview trong bản LTS tiếp theo.
Một thay đổi lớn cho Java
Kỹ sư phần mềm của Oracle, Lois Foltan, đã xác nhận rằng Đề xuất Cải tiến Java (JEP) 401 cho Value Classes and Objects – một phần của Project Valhalla – sẽ được tích hợp vào nhánh chính của OpenJDK vào đầu tháng tới, nhắm mục tiêu đến JDK 28. Hiện tại, phiên bản JDK mới nhất là 26, với JDK 27 dự kiến ra mắt vào tháng 9 và JDK 28 vào tháng 3 năm 2027. Phiên bản hỗ trợ dài hạn (LTS) tiếp theo nhiều khả năng sẽ là JDK 29 vào tháng 9 năm 2027.
Foltan mô tả đây là một "thay đổi cực kỳ lớn", đến mức các thành viên đóng góp khác của OpenJDK được yêu cầu tránh thực hiện các cam kết (commit) lớn để giúp quá trình tích hợp diễn ra thành công. Yêu cầu kéo (pull request) cho bản xem trước đầu tiên của JEP 401 thêm hơn 197.000 dòng mã trong 1.816 tệp đã thay đổi.
Giải quyết hạn chế lâu đời
Được tạo ra vào tháng 8 năm 2022, JEP 401 giải quyết một hạn chế lâu đời của Java: ngoại trừ một số lượng nhỏ kiểu nguyên thủy (primitives) như int, char, byte và double, tất cả các kiểu trong ngôn ngữ này đều là kiểu tham chiếu (reference types). JEP này giới thiệu các "đối tượng giá trị" (value objects) – các thể hiện của lớp không có định danh đối tượng (object identity) và chỉ được phân biệt bởi giá trị của các trường (fields) của chúng.
Một vài ví dụ minh họa vấn đề mà JEP 401 đang cố gắng giải quyết. Lớp LocalDate của Java lưu trữ các giá trị ngày tháng, nhưng mọi thể hiện đều có tham chiếu duy nhất của riêng nó, do đó, ngay cả khi hai thể hiện đại diện cho cùng một dữ liệu, việc so sánh chúng bằng toán tử == sẽ trả về false, vì chúng là các đối tượng khác nhau trong bộ nhớ. LocalDate thay vào đó cung cấp phương thức "equals".
Một ví dụ khác gây nhầm lẫn hơn là Integer, lớp bao bọc int để cung cấp các phương thức tiện lợi như toString(). Về mặt nội bộ, Integer lưu trữ các thể hiện cho các giá trị dưới 128, vì vậy hai đối tượng Integer có cùng một giá trị nhỏ có thể so sánh bằng nhau bằng ==, nhưng đối với các giá trị lớn hơn, == luôn trả về false ngay cả khi các giá trị cơ bản khớp nhau. Do sự kỳ quặc này, các trình soạn thảo Java thường cảnh báo không nên sử dụng == với Integer, một cạm bẫy mà JEP 401 mô tả là "sự phức tạp không mong muốn".
JEP 401 sẽ chuyển đổi một số lớp JDK như Integer sang các lớp giá trị, và số lượng lớp được chuyển đổi này có thể sẽ tăng dần. Các nhà phát triển cũng sẽ có thể tạo ra các lớp giá trị của riêng mình.
Tối ưu hóa hiệu suất
Một trong những mục tiêu của JEP 401 là trao tự do cho JVM (Máy ảo Java) để lưu trữ các đối tượng giá trị theo cách tối ưu hóa hiệu suất tối đa. Dấu chân bộ nhớ của các kiểu tham chiếu lớn hơn so với các kiểu giá trị, và chúng phải được giải tham chiếu (dereferenced) để lấy giá trị. Việc lặp lại trên các kiểu giá trị hiệu quả hơn.
Project Valhalla đã được ấp ủ trong suốt một thời gian dài, do sự phức tạp của các thay đổi, đến mức một số người quan sát đã đùa rằng sẽ đến được Valhalla (một cõi thế giới bên kia trong thần thoại Bắc Âu) trước khi dự án được hoàn thành.
Kiến trúc sư Ngôn ngữ Java của Oracle, Brian Goetz, cho biết đây "chỉ là phần đầu tiên của Valhalla" và ngay cả khi bản xem trước được phát hành, "nhóm người 'họ sẽ không bao giờ phát hành nó' sẽ nhanh chóng chuyển sang nói 'nhưng họ chưa phát hành phần quan trọng nhất' sớm thôi."
Goetz nói rằng "có nhiều thứ buộc chúng ta phải xử lý các đối tượng với ngữ nghĩa tham chiếu. JEP 401 phá vỡ cấp độ đầu tiên của những thứ này, bằng cách loại bỏ định danh (identity) khỏi phương trình, điều này tiết lộ nhiều tối ưu hóa mới, đặc biệt là cho các đối tượng nhỏ hơn. Nhưng việc xử lý hoàn toàn các đối tượng với ngữ nghĩa giá trị đòi hỏi phải hy sinh nhiều hơn nữa: tính null và tính an toàn nguyên tử trong điều kiện tranh chấp (ASUR). Nhiều ngôn ngữ đã có, hoặc đang làm việc, để đạt được điều đó, (như struct trong C#)."
Những thay đổi phá vỡ và lộ trình
Ông nói thêm rằng Valhalla sẽ giới thiệu các thay đổi phá vỡ (breaking changes) có chủ đích đối với Java, chẳng hạn như "mã đồng bộ hóa trên các đối tượng Integer hiện sẽ thất bại với một ngoại lệ."
Goetz bổ sung rằng JEP 401 có khả năng vẫn sẽ ở trạng thái preview trong bản phát hành LTS tiếp theo của JDK. "Hy vọng rằng nó sẽ thoát khỏi preview cho phiên bản 29 dường như là ... quá lạc quan. Vector API có thể thoát khỏi giai đoạn ấp ủ (incubation) khi nó xây dựng lại trên các nguyên thủy VM cơ bản từ Valhalla... đừng hy vọng vào một cửa sổ preview ngắn hơn bình thường."
