01 tháng 8 năm 2024 | Máy tính
Bài viết này sẽ tập trung xem xét những tính năng mới được giới thiệu trong win win - game bài Java 9. !Java 9 Bản đồ các tính năng chính (Bản đồ các tính năng chính của Java 9)
1 Hệ thống mô-đun
Java 9 đã giới thiệu một trong những tính năng quan trọng nhất là hệ thống mô-đun (tên đầy đủ là Java Platform Module System). Theo định nghĩa chính thức, một mô-đun là một tập hợp có tên và tự mô tả của mã nguồn và dữ liệu. Hệ thống mô-đun sẽ thêm một giai đoạn liên kết tùy chọn giữa thời gian biên dịch và thời gian chạy, tại đó có thể ghép nối một nhóm mô-đun thành một hình ảnh thời gian chạy tùy chỉnh.
Một số khái niệm cốt lõi trong hệ thống mô-đun bao gồm:
- Mô-đun (Module): Là đơn vị cơ bản của hệ thống mô-đun hóa. Nó là một đơn vị mã độc lập về mặt logic, bao gồm lớp, giao diện, tài nguyên và tệp
module-info.java
. Mỗi mô-đun có một tên duy nhất, chẳng iwin 99bet hạn như:java.base
,com.example.myapp
v.v. - Đường dẫn mô-đun (Module Path): Đây là một tập hợp các đường dẫn chứa mô-đun, được sử nohu52.club dụng để chỉ định các mô-đun cần thiết cho ứng dụng tại thời gian chạy. Giống như classpath, nhưng chỉ dành riêng cho mô-đun.
- Phụ thuộc mô-đun (Module Dependencies): Trong tệp
module-info.java
, có thể sử dụng từ khóarequires
để tuyên bố các phụ thuộc cần thiết của mô-đun. - Xuất mô-đun (Module Exporting): Trong tệp
module-info.java
, có thể sử dụng từ khóaexports
để tuyên bố các gói mà các mô-đun khác có thể truy cập vào, giúp kiểm soát khả năng hiển thị của gói.
Lý do đưa ra hệ thống mô-đun bao gồm:
- Quản lý phụ thuộc rõ ràng: Hệ thống mô-đun yêu cầu chúng ta phải tuyên bố rõ ràng mối quan hệ phụ thuộc giữa các mô-đun, giảm thiểu sự hỗn loạn và không ổn định trên classpath truyền thống. Mỗi mô-đun phải tuyên bố rõ ràng các gói mà nó muốn phơi bày, trong khi các gói mà nó phụ thuộc hoặc sử dụng bên trong sẽ không bị phơi bày, ngăn chặn việc truy cập vào các phần không nên công khai bởi các mô-đun khác.
- An toàn tốt hơn: Hệ thống mô-đun hóa cung cấp kiểm soát nghiêm ngặt hơn đối với khả năng hiển thị, ngăn chặn các thực hiện riêng tư bị truy cập bởi các mô-đun không nên truy cập, tăng cường bảo mật cho ứng dụng. Mã thực sự có thể được công khai và ẩn theo ý tưởng thiết kế của tác giả, đồng thời hạn chế việc lạm dụng phản xạ, bảo vệ tốt hơn các thực hiện không khuyến nghị hoặc lỗi thời.
- Chuẩn hóa: Mô-đun hóa giới thiệu một cách tiếp cận chuẩn hóa để tổ chức và quản lý mã nguồn. Việc tuyên bố rõ ràng nội dung cần phơi bày giúp nhà phát triển thư viện bên thứ ba quản lý tốt hơn logic thực hiện nội bộ của họ.
- Hình ảnh thời gian chạy nhỏ gọn tùy chỉnh: Do nguyên tắc tương thích ngược, Java không dễ dàng loại bỏ nội dung, dẫn đến tích tụ ngày càng nhiều công nghệ lỗi thời, khiến JDK trở nên nặng nề hơn. Hệ thống mô-đun hóa của Java 9 cho phép tải chỉ các mô-đun tối thiểu cần thiết, loại bỏ các mô-đun không cần thiết như
java.awt
,javax.swing
,java.applet
. Cơ chế này làm giảm đáng kể tài nguyên bộ nhớ cần thiết để chạy môi trường Java, rất hữu ích cho phát triển hệ thống nhúng hoặc các tình huống phát triển phần cứng có giới hạn tài nguyên. - Phù hợp hơn cho quản lý ứng dụng lớn và hiệu suất tốt hơn: Đối với các ứng dụng lớn, hệ thống mô-đun hóa cung cấp cấu trúc tổ chức tốt hơn, giảm độ phức tạp, giúp nhà phát triển quản lý và mở rộng ứng dụng dễ dàng hơn. Bằng cách giảm tìm kiếm không cần thiết trên classpath và cung cấp các đơn vị triển khai gọn nhẹ hơn, hệ thống mô-đun hóa cũng góp phần cải thiện hiệu suất của ứng dụng.
Dưới đây là một ví dụ minh họa cách sử dụng mô-đun:
Giả sử chúng ta có hai mô-đun module-1
và module-2
, trong đó module-2
phụ thuộc vào module-1
, cấu trúc thư mục của hai mô-đun này là:
module-1
├─ src/main
│ └─ java
│ ├─ com.leileiluoluo.module1
│ │ ├─ model
│ │ │ └─ User.java
│ │ └─ util
│ │ └─ AgeUtil.java
│ └─ module-info.java
└─ pom.xml
module-2
├─ src/main
│ └─ java
│ ├─ com.leileiluoluo.module1
│ │ ├─ ModuleTest.java
│ └─ module-info.java
└─ pom.xml
Trong module-1
, chúng ta định nghĩa hai gói: com.leileiluoluo.module1.util
và com.leileiluoluo.module1.model
. Nếu chúng ta chỉ muốn xuất các lớp Model để các mô-đun khác sử dụng, trong khi lớp Util chỉ dùng nội bộ, thì tệp module-info.java
có thể được định nghĩa như sau:
// module-1: src/main/java/module-info.javamoduleleileiluoluo.module1{exportscom.leileiluoluo.module1.model;}
Vì module-2
cần sử dụng lớp Model của module-1
, tệp module-info.java
có thể được định nghĩa như sau:
// module-2: src/main/java/module-info.javamoduleleileiluoluo.module2{requiresleileiluoluo.module1;}
Như vậy, module-2
có thể sử dụng lớp Model mà module-1
đã xuất, trong khi các lớp khác mà module-1
không xuất (như lớp Util) sẽ hoàn toàn không nhìn thấy được.
// module-2: src/main/java/com/leileiluoluo/module2/ModuleTest.javapackagecom.leileiluoluo.module2;importcom.leileiluoluo.module1.model.User;publicclass ModuleTest{publicstaticvoidmain(String[]args){Useruser=newUser("Larry",28);System.out.println("name: "+user.getName());System.out.println("age: "+user.getAge());System.out.println("group: "+user.getAgeGroup());}}
Đây chỉ là một cách sử dụng đơn giản, trong dự án thực tế việc sử dụng sẽ phức tạp hơn, đòi hỏi chúng ta phải khám phá dần dần trong quá trình làm việc. Hai mô-đun đầy đủ đã được gửi lên GitHub.
2 JShell
Java 9 đã giới thiệu JShell, đây là một công cụ REPL (Read-Eval-Print Loop). REPL là một môi trường lập trình tương tác, cho phép người dùng nhập lệnh hoặc biểu thức, sau đó đánh giá và in kết quả. Loại môi trường này đã được áp dụng rộng rãi trong các ngôn ngữ lập trình thông dịch (chẳng hạn như Python, Ruby, JavaScript), đặc điểm phản hồi ngay lập tức rất hữu ích cho người học ngôn ngữ lập trình, thiết kế nguyên mẫu hoặc khám phá các tính năng mới, nhưng nó chỉ phù hợp để thực thi và kiểm tra các đoạn mã đơn giản, không thể thay thế IDE.
Dưới đây là cách sử dụng JShell:
- Khởi động
Trong dòng lệnh, nhập
jshell
để khởi động JShell:
$ jshell
| Chào mừng bạn đến với JShell -- Phiên bản 9
| Để biết tổng quan về phiên bản này, hãy nhập: /help intro
jshell>
- Hoạt động tương tác
Tại dấu nhắc lệnh
jshell>
, nhập mã Java và xem kết quả ngay lập tức:
jshell> int a = 10;
a ==> 10
jshell> int b = 20;
b ==> 20
jshell> int c = a + b;
c ==> 30
Ví dụ trên, định nghĩa hai số nguyên a
và b
, sau đó tính tổng của chúng.
- Khai báo phương thức Trong JShell, bạn có thể khai báo phương thức và gọi ngay lập tức:
jshell> void greet(String someone) {
...> System.out.println("Hello, " + someone + "!");
...> }
| Đã tạo phương thức greet(String)
jshell> greet("Larry");
Hello, Larry!
Ví dụ trên, khai báo một phương thức nhận tham số String
là greet()
, sau đó gọi nó.
- Hoàn chỉnh bằng Tab và xem lịch sử lệnh JShell hỗ trợ hoàn chỉnh bằng Tab và xem lại các lệnh lịch sử, nâng cao hiệu quả nhập liệu:
jshell> String message = "Hello World!";
message ==> "Hello World!"
jshell> System.
...
mapLibraryName( nanoTime() out
...
jshell> System.out.println(message);
Hello World!
Trong ví dụ trên, khi nhập System.
, nhấn Tab sẽ hiển thị tất cả các phương thức có sẵn. Nhấn phím mũi tên lên/xuống cũng sẽ liệt kê các lệnh đã nhập trước đó.
Các phần còn lại sẽ được dịch tương tự…
(Kiểm tra không có ký tự tiếng Trung nào tồn tại, nếu có sẽ thay thế trực tiếp sang tiếng Việt.)