JDK 9 có gì hot ?
Vậy là sau quãng thời gian dài chờ mong, thì tháng 9 vừa rồi Oracle đã chính thức cho ra mắt phiên bản Java mới nhất cùng với bộ công cụ phát triển là JDK 9. Tháng 9 ra mắt JDK 9, thật ra đây chỉ là một sự trùng hợp về con số, cái tên JDK 9 xuất phát từ việc nâng cấp dựa trên nền tảng trước đó là ...
Vậy là sau quãng thời gian dài chờ mong, thì tháng 9 vừa rồi Oracle đã chính thức cho ra mắt phiên bản Java mới nhất cùng với bộ công cụ phát triển là JDK 9. Tháng 9 ra mắt JDK 9, thật ra đây chỉ là một sự trùng hợp về con số, cái tên JDK 9 xuất phát từ việc nâng cấp dựa trên nền tảng trước đó là JDK 8. Vậy trong JDK 9 có gì mới lạ, bài viết này chúng ta sẽ cùng tìm hiểu nhé.
Cũng như phiên bản Java 8 trước đó, Java 9 trong lần ra mắt này của nó cũng có thể coi là một cuộc cách mạng với những thay đổi lớn. Chúng ta hãy cùng điểm qua các thay đổi đáng chú ý nhất của JDK 9 lần lượt như dưới đây:
I. Hệ thống module hóa Jigsaw Nếu như JDK 8 được coi là một cuộc cách mạng trong cách mà lập trình viên viết code qua biểu thức lambda và tư duy lập trình hàm (functional programming), thì JDK 9 được coi là một cuộc cách mạng về cách mà lập trình viên đóng gói và triển khai ứng dụng chạy trên nền tảng này.
Vậy tại sao cần có cuộc cách mạng này, chúng ta hãy cùng nhau nhìn lại một số vấn đề mà các phiên bản Java trước đó đang gặp phải như sau:
-
Tính đóng gói chưa đủ mạnh: Chắc hẳn trong chúng ta ai cũng quen thuộc với đặc tính này của ngôn ngữ hướng đối tượng rồi. Cụ thế trong java, tính đóng gói (encapsulation) quy định việc truy cập vào các biến và hàm qua các access modifier như là private, protected, public. Vấn đề ở chỗ khi một thuộc tính hay phương thức được đặt là public thì nó sẽ có thể được truy cập từ bất kì một thư viện, hay một thành phần nào khác trong ứng dụng. Trong một số trường hợp, ở trong cùng một ứng dụng, người ta chỉ muốn thuộc tính hay phương thức được truy cập ở thư viện này, nhưng sẽ hạn chế ở thư viện khác thì tính đóng gói hiện tại không có một công cụ nào có thể giúp làm điều đó cả.
-
Các thư việc được đóng gói thành các file *.jar, từ tên các package, đến tên các lớp trong các file *.jar này có thể đặt hoàn toàn giống nhau mặc dù bên trong nội dung của chúng thì khác nhau. Từ đó dẫn đến các tiềm ẩn rủi ro khi không xác định được chính xác lớp nào mới thực sự có hiệu lực trong quá trình chạy ứng dụng. Và lỗi lầm sẽ chỉ được biết đến khi ứng dụng đã chạy thật và truy cập vào lớp có nội dung không đúng, như vậy là quá muộn, đúng ra chúng ta cần thấy ngay những vấn đề đó từ lúc bật ứng dụng lên.
-
Đóng gói ứng dụng với một tập hợp các file thư viện .jar sẽ tạo nên một ứng dụng có kích thước lớn mặc dù về mặt chức năng ta chỉ dùng đến một vài thứ trong các thư viện đó mà thôi. Điều này không tốt khi mà ngày nay việc thiết kế ứng dụng theo mô hình Microservice ngày càng phổ biến, ở mỗi service như thế, người ta mong muốn ứng dụng sẽ là nhỏ gọn nhất có thể trên cả hai phương diện chức năng lẫn kích thước vật lý. Tất cả những điều trên đã gây ra biết bao nhiêu thống khổ và đau đớn cho các lập trình viên. Chính vì thế mà thiên hạ đã gọi chúng là “địa ngục JAR” hay tên tây là “JAR Hell“.
Chính vì những lý do trên mà Java 9 sẽ tiến hành cơ cấu tổ chức lại toàn bộ các thành phần của nó. Và quá trình này được hoàn thiện nhờ vào một dự án có tên là Jigsaw. Jigsaw – thuật ngữ làm ta gợi nhớ đến trò chơi xếp hình mà ở đó giải pháp đến từ chính những mảnh ghép nhỏ. Trong lập trình cũng vậy, một ứng dụng luôn là một tổ hợp từ việc lắp ghép các thành phần (component) lại với nhau. Các nhà sáng lập đã lấy tư tưởng này để đưa vào JDK 9 bằng việc định nghĩa lại một ứng dụng dưới dạng các module. Từ khóa module là một trong những từ khóa được nhắc đến nhiều nhất khi nói về JDK 9.
Module nôm na có thể hiểu tương đương với các *.jar file ở thời điểm trước JDK 9, tuy nhiên nó có những đặc tính để khắc phục tất cả các điểm yếu “JAR Hell” mà ta đã kể ở trên. Một module có thể được đóng gói dưới dạng cái file *.jmod là một loại định dạng file đóng gói mới trong Java 9. Tuy nhiên để đảm bảo khả năng tương thích ngược cho các thư viện có sẵn, module trong Java 9 cũng có thể tồn tại dưới dạng file *.jar. Trong thời gian tới chúng ta sẽ có hẳn một bài viết riêng về hệ thống Module hóa Jigsaw này trong Java 9.
II. Lập trình reactive với chuẩn Reactive Stream Lập trình Reactive là phong cách lập trình cho phép thực hiện các xử lý Non-Blocking để có thể tối ưu các tài nguyên xử lý. Reactive Stream là một chuẩn mà ở đó nó quy định các API để lập trình viên có thể sử dụng phát triển ứng dụng theo phong cách Reactive, và nó có rất nhiều cài đặt. Trong các phiên bản trước của Java, Reactive Stream chỉ được coi là một thứ không chính thống với một cài đặt có thể kể tên là ReactiveX/Java. Thời đó, để có thể lập trình Reactive thì người dùng phải khai báo các thư viện hỗ trợ vào trong ứng dụng của mình. Hoặc như trước thời điểm Java 9 chính thức ra mắt một chút, thì Spring 5 ra đời cũng cho phép lập trình theo phong cách Reactive nhờ vào một cài đặt khác của chuẩn Reactive Stream là Reactor.
Đứng trước thực tế là phong cách lập trình Reactive mang lại nhiều lợi ích. Java 9 đã chấp nhận chuẩn Reactive Stream như một chuẩn chính thống của bản thân ngôn ngữ. Và tất nhiên là Java 9 có các cài đặt riêng cho chuẩn này qua các Flow API, từ đó mà ta có thể lập trình các ứng dụng Java theo phong cách Reactive mà không cần dùng thêm bất cứ thư viện bên ngoài nào.
III. API cho giao thức HTTP2 HTTP/2 là một sự nâng cấp cải tiến và khắc phục nhiều nhược điểm của phiên bản trước đó là HTTP/1.1. Một số các lợi ích của HTTP/2 mà ta có thể kể tên như là:
HTTP/2 hỗ trợ multiplexing (ghép kênh), tức là chỉ bằng một kết nối, dữ liệu có thể được gửi đi gửi lại từ cả hai phía là client và server. Từ đó số lượng kết nối đến server sẽ được giảm đi so với trước. Tính năng này giống với những gì mà websocket đang mang lại. Tuy nhiên để dùng websocket, ta lại cần một quãng thời gian để có thể nâng cấp giao thức từ HTTP lên WS. HTTP/2 hỗ trợ nén dữ liệu cho phần header, và trong nội dung hỗ trợ gửi dữ liệu theo định dạng nhị phân thay vì dạng văn bản như HTTP/1.1. Vì thế mà gói tin gửi đi được tối ưu về kích thước hơn so với trước. Java 9 tạo hẳn một module riêng cho các API của HTTP/2 và trong tương lai thì các API này sẽ dần các API cũ của HTTP/1.1 hiện nằm trong package java.net. Theo đánh giá thì cú pháp của các API cho HTTP/2 sẽ dễ hiểu và dễ dùng hơn các API cũ cũng như tài liệu về nó cũng đầy đủ hơn. Một phần cũng là vì các API cũ vốn được thiết kế ra không chỉ hỗ trợ mỗi HTTP mà còn rất nhiều các giao thức khác như FTP chẳng hạn, vì thế nên mà bản thân chúng khá hổ lốn và trừu tượng cho người sử dụng.
IV. JShell JShell là một công cụ hỗ trợ REPL trong Java. REPL viết tắt của Read-Eval-Print-Loop nói về một mô hình giúp các lập trình viên có thể tiến hành nhanh hơn các công việc như thử nghiệm các đoạn mã, hay demo các API trong quá trình phát triển ứng dụng của mình.
Nếu trước đây lập trình viên vẫn cứ phải tạo một lớp Test với phương thức main() để demo, thì bây giờ chỉ cần bật JShell lên và chạy đoạn mã Java muốn demo trên đó. Đoạn mã sẽ được đọc bởi JShell, sau đó JShell sẽ tiến hành thực thư đoạn mã này với cam kết rằng mọi hành vi sẽ giống như khi chạy trên máy ảo Java thật. Sau đó kết quả sẽ được trả về trên màn hình của JShell và bản thân JShell sẽ lại tiếp tục chờ để đón nhận xử lý các đoạn mã tiếp theo. Quá trình cứ lặp đi lặp lại như vậy, phản ánh đúng như những gì cái tên REPL đã nói lên (Trong bài viết trước “Giới thiệu về NodeJS“, ta cũng có nói về REPL được hỗ trợ sau khi cài đặt Node, JShell ở đây cũng sẽ tương tự như vậy nhưng là cho ngôn ngữ Java thay vì Javascript).
V. Các cập nhật khác Bên ngoài các thứ mới mẻ nổi bật như đã nói ở trên thì còn có một loạt các cập nhật khác nữa, ví dụ như các API liên quan đến Process, Collection, Stream (từ Java 8), Stack Walker, Logging và tất nhiên không thể thiếu một bộ API liên quan đến quản lý Module mà ta đã nói ở phần I gọi là Module API…
Trong bài viết này, ta chỉ nhắc đến những thay đổi về mặt cú pháp ngôn ngữ cũng như tư duy tổ chức ứng dụng. Tuy nhiên thì các bạn cũng đừng quên là chính bản thân nội tại của máy ảo Java ở phiên bản mới bao giờ cũng sẽ có cải tiến hơn ở những phiên bản trước ở một góc độ nào đó, ví dụ như ở khía cạnh tốc độ xử lý hay quản lý bộ nhớ chẳng hạn… Chính vì thế đây cũng có thể coi là một trong những lợi ích khi nâng cấp ứng dụng lên chạy với Java 9, thậm chí kể cả khi mà ứng dụng của bạn chưa sử dụng một dòng lệnh nào của riêng Java 9 cả, thì ứng dụng của bạn cũng đang được đón nhận những cải thiện hơn rồi.
Để có một cái nhìn đầy đủ nhất về những thứ thay đổi, bản có thể lên trang tài liệu của Oracle theo link ở đây.: https://docs.oracle.com/javase/9/whatsnew/toc.htm#JSNEW-GUID-C23AFD78-C777-460B-8ACE-58BE5EA681F6 https://www.pluralsight.com/blog/software-development/java-9-new-features