Java 9 phát hành vào tháng 9 năm 2017 đã mang đến nhiều tính năng và cải tiến mạnh mẽ, đặc biệt trong việc tổ chức mã nguồn và tối ưu hóa hiệu suất hệ thống.
1. Java Platform Module System (JPMS) – Jigsaw Project
Đây là tính năng quan trọng nhất trong Java 9, nó cung cấp hệ thống module cho phép chia ứng dụng thành các module nhỏ hơn, dễ quản lý hơn. Điều này giúp cải thiện khả năng bảo trì và tối ưu hóa kích thước ứng dụng, cũng như giảm thời gian khởi động.
- Module: Tập hợp các package và tài nguyên liên quan.
- Module Descriptor: Mỗi module có file
module-info.java
định nghĩa các dependency và các package export của module đó.
2. REPL – JShell
Java 9 giới thiệu JShell là một công cụ REPL (Read-Eval-Print-Loop) cho phép thực hiện các dòng lệnh Java ngay lập tức mà không cần tạo file hoặc class
. Đây là tính năng hữu ích cho việc học tập, thử nghiệm các đoạn mã ngắn và kiểm tra nhanh các tính năng.
jshell> System.out.println("Hello, JShell!");
3. Factory Method
Java 9 giới thiệu các phương thức static factory mới như List.of()
, Set.of()
, và Map.of()
giúp khởi tạo các collection bất biến. Các phương thức này giúp việc khởi tạo collection trở nên nhanh chóng và đơn giản, tránh việc phải sử dụng nhiều dòng mã và lệnh new
.
public class App { public static void main(String[] args) { List list = List.of("Java", "PHP", "Python"); list.stream().forEach(System.out::println); Map<Integer, String> map = Map.of(1, "Vietnam", 2, "Lao", 3, "Cambodia"); map.forEach((index, s) -> System.out.println(index + "=" + s)); Set<String> set = Set.of("Java","JavaFX","Spring","Hibernate","JSP"); for(String s : set) { System.out.println(s); } } }
4. Anonymous Inner Class
Một lớp ẩn danh thường được sử dụng để triển khai một interface hoặc kế thừa một lớp trừu tượng (abstract class) mà không cần phải khai báo lớp riêng biệt. Đây là cách tạo nhanh một đối tượng cụ thể mà chỉ được sử dụng ở một vị trí duy nhất trong chương trình.
– Định nghĩa abstract class AnonymousInnerClasses<T>
public abstract class AnonymousInnerClasses<T> { abstract T calculate(int a, int b); }
– Ứng dụng
public class App { public static void main(String[] args) { int a = 10, b = 3; add(a, b); multi(a, b); } static void add(int a, int b) { AnonymousInnerClasses classes = new AnonymousInnerClasses<>() { @Override Integer calculate(int x, int y) { return x + y; } }; System.out.println("a + b = " + classes.calculate(a, b)); } static void multi(int a, int b) { AnonymousInnerClasses classes = new AnonymousInnerClasses() { @Override Integer calculate(int x, int y) { return x - y; } }; System.out.println("a - b = " + classes.calculate(a, b)); } }
5. Java Runtime Version
Java 9 cung cấp một định dạng phiên bản chuẩn và một API mới (Runtime.Version) để giúp lập trình viên dễ dàng truy vấn và quản lý thông tin về phiên bản Java Runtime. Điều này làm cho việc làm việc với phiên bản Java trở nên chính xác và rõ ràng hơn, đồng thời giúp nâng cao khả năng tương thích giữa các hệ thống và module trong môi trường Java.
public class JavaRuntimeVersion { public static void main(String[] args) { Runtime.Version version = Runtime.version(); System.out.println("version() =" + version.version()); // version: Số phiên bản System.out.println("build() =" + version.build()); // build: Số build của phiên bản cụ thể. System.out.println("major() =" + version.major()); // major: Số phiên bản chính (ví dụ: 9 cho Java 9). System.out.println("minor() =" + version.minor()); // minor: Phiên bản phụ, thường được sử dụng cho các cập nhật nhỏ hoặc tính năng mới. System.out.println("hashCode() =" + version.hashCode()); // Mã code của phiên bản System.out.println("pre() =" + version.pre()); // pre-release: Thông tin về các phiên bản trước khi phát hành (ví dụ: alpha, beta). System.out.println("pre() =" + version.patch()); // patch: Bản vá bổ sung, cung cấp sửa lỗi không liên quan đến bảo mật. System.out.println("security() =" + version.security()); // security: Bản cập nhật bảo mật, tương ứng với các bản vá bảo mật hoặc lỗi. } }
6. Improvements in Stream API
Stream API được cải tiến thêm một số phương thức mới như:
takeWhile()
: Lấy các phần tử trong stream cho đến khi điều kiện trở nên false.dropWhile()
: Bỏ qua các phần tử cho đến khi điều kiện trở nên false.ofNullable()
: Tạo stream có thể chứa null.iterate()
: Hỗ trợ thêm điều kiện dừng.
– Ví dụ takeWhile()
public class App { public static void main(String[] args) { List noResult = Stream.of(1, 2, 3, 2, 4, 5, 6, 7, 8, 9, 10) .takeWhile(i -> (i % 2 == 0)).collect(Collectors.toList()); System.out.println("No result: " + noResult); List result = Stream.of(2, 2, 3, 2, 4, 5, 6, 7, 8, 9, 10) .takeWhile(i -> (i % 2 == 0)).collect(Collectors.toList()); System.out.println("Result: " + result); } }
– Ví dụ dropWhile()
// dropWhile() public class App { public static void main(String[] args) { List list = Stream.of(2, 2, 3, 2, 5, 6, 7, 8, 9, 10) .dropWhile(i -> (i % 2 == 0)).collect(Collectors.toList()); System.out.println(list); } }
– Ví dụ ofNullable()
// ofNullable() public class App { public static void main(String[] args) { Stream val = Stream.ofNullable(null); val.forEach(System.out::println); } }
– Ví dụ iterate()
// iterate() public class App { public static void main(String[] args) { // create a stream using iterate Stream stream = Stream.iterate(2, i -> i <= 100, i -> i * 2); // print Values stream.forEach(System.out::println); } }
7. Private Interface Methods
Java 9 cho phép khai báo private methods trong interface điều này giúp tái sử dụng mã trong các default và static method mà không cần lặp lại code.
Ví dụ:
public interface PrivateInterfaceMethods { default void sayHello() { System.out.println("Hello Tây Java"); } // new feature in java 9 private void speak() { System.out.println("Welcome to Java 9"); } // new feature in java 9 private static void goodbye() { System.out.println("Good bye!"); } void printMessage(); }
8. HTTP/2 Client
Java 9 cung cấp một API HTTP/2 Client mới thay thế cho HttpURLConnection
. API mới hỗ trợ HTTP/2 và WebSocket giúp giao tiếp mạng nhanh hơn và dễ sử dụng hơn.
Ví dụ:
public class App { public static void main(String[] args) throws IOException, InterruptedException { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://tayjava.vn")) .build(); HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body()); } }
9. Multi-Release JAR Files
Tính năng này cho phép một file JAR chứa nhiều phiên bản class khác nhau hỗ trợ cho các phiên bản Java khác nhau. Điều này giúp cho việc duy trì tương thích ngược với các phiên bản Java cũ mà không cần phải tạo nhiều file JAR riêng biệt.
10. Enhanced Process API
Java 9 cải thiện API liên quan đến quản lý tiến trình (Process API) giúp dễ dàng quản lý và giám sát các process hệ thống.
public class App { public static void main(String[] args) { ProcessHandle processHandle = ProcessHandle.current(); System.out.println("PID: " + processHandle.pid()); System.out.println("Direct Children: " + processHandle.children()); System.out.println("Class Name: " + processHandle.getClass()); System.out.println("Info: " + processHandle.info()); System.out.println("Info: " + processHandle.isAlive()); } }
11. Improved Deprecation
Trước Java 9, khi một API bị deprecated
nó chỉ có annotation @Deprecated
nghĩa là API đó có thể không còn được hỗ trợ trong các phiên bản tương lai nhưng không có thông tin cụ thể về việc khi nào nó sẽ bị loại bỏ hoàn toàn hoặc nếu nó thực sự có bị loại bỏ hay không.
Cú pháp:
// forRemoval: Một boolean cho biết liệu API này có thực sự dự định bị loại bỏ trong tương lai hay không. // since: Chỉ ra từ phiên bản nào API này đã bắt đầu bị deprecated @Deprecated(since = "9", forRemoval = true) public void deprecatedMethodName() { // logic }
12. Miscellaneous Changes
- Unified JVM Logging: Hợp nhất hệ thống log của JVM với một API duy nhất dễ cấu hình.
- Compact Strings: Sử dụng kiểu dữ liệu
byte[]
cho các chuỗi Unicode chỉ chứa các ký tự Latin-1 giúp tiết kiệm bộ nhớ hơn. - Variable Handles: API mới tương tự như
java.util.concurrent.atomic
nhưng mạnh mẽ và linh hoạt hơn.