Bộ sưu tập

Java 9 phiên bản mới có gì vui ?


https://codersontrang.com/2017/10/16/java-9-phien-ban-moi-co-gi-vui/
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.

VI. Nâng cấp các ứng dụng Java hiện tại lên Java 9

Có lẽ chưa có một phiên bản Java nào mà việc nâng cấp các ứng dụng hiện tại sao cho tương thích với nền tảng mới nhất lại khó khăn như Java 9. Nguyên nhân là do Java 9 đã tổ chức và cơ cấu lại hoàn toàn từ bên trong bản thân lõi của JDK. Quá trình Module hóa sẽ đòi hỏi tất cả các thư viện khác cũng sẽ phải đi theo cách tổ chức như thế này. Mặc dù Java 9 mới có bản chính thức từ tháng 9 này, nhưng trước đó tài liệu về những thay đổi cũng như có hẳn một phiên bản JDK Early Access (ea) được loan cáo từ khá lâu cho cộng đồng. Tuy nhiên đến thời điểm này có vẻ hầu như các third-party và các thư viện của họ vẫn chưa sẵn sàng để có thể làm việc với Java 9. Đặc biệt khi hai thư viện từ hai third-party khác nhau bị xung đột theo một số quy tắc mới của hệ thống module Jigsaw.

Một ví dụ có thể kể đến là Hibernate, đến thời điểm này Hibernate phiên bản 5.2.11.Final vẫn chỉ có thể chạy với Java 8. Nguyên nhân là do trong một dependencies của nó (file *.jar) cũng khai báo package javax.transaction.xa. Và điều này xung đột với module java.sql nằm trong lõi của JDK 9. Có lẽ chúng ta phải chờ thêm một thời gian nữa, trừ khi ứng dụng của bạn là ứng dụng dùng rất ít các thư viện ngoài, còn nếu không thì việc nâng cấp để chạy lên phiên Java 9 sẽ tốn khá nhiều công sức và quan trọng hơn là phải chờ các thư viện ngoài cập nhật xong.

Như vậy là bài viết đã phác họa lên phần nào bức tranh về Java 9. Hy vọng bạn đọc có được thông tin hữu ích để có những định hướng trong việc cập nhật kiến thức về Java 9 cũng như nâng cấp ứng dụng của mình trong thời gian tới. Và tất nhiên rồi, Coder Sơn Trang sẽ cố gắng để có thêm nhiều những bài viết nữa về các vấn đề cụ thể liên quan đến phiên bản mới nhất của nền tảng lập trình bậc nhất này.

Good luck!

Có thể bạn cũng quan tâm:

Advertisements

3 comments on “Java 9 phiên bản mới có gì vui ?

  1. Pingback: Java 10 phiên bản mới có gì vui ? | Coder Sơn Trang

  2. Pingback: Java 11 phiên bản mới có gì vui ? | Coder Sơn Trang

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google photo

Bạn đang bình luận bằng tài khoản Google Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s