Trong Java, generic là một tính năng cho phép bạn chỉ định loại object hoặc class mà không cần phải chỉ định loại chính xác. Điều này cho phép code của bạn linh hoạt hơn và có thể sử dụng lại.
Khi bạn tạo một class hoặc một phương thức sử dụng generic, bạn có thể chỉ định một trình giữ chỗ cho loại, có thể được thay thế bằng một loại thực tế khi class hoặc phương thức được sử dụng.
Các bài viết liên quan:
Ví dụ generic trong java
Ví dụ: bạn có thể tạo một class có tên là “Box” có thể chứa một object thuộc bất kỳ loại nào bằng cú pháp sau:
public class Box<T> { private T object; public void set(T object) { this.object = object; } public T get() { return object; } }
Ở đây, T là trình giữ chỗ cho loại object mà Box có thể chứa. Khi bạn tạo một thể hiện của class Box, bạn có thể chỉ định loại object thực tế mà Box sẽ chứa, chẳng hạn như:
Box<String> stringBox = new Box<String>(); stringBox.set("Hello"); String someString = stringBox.get();
Hoặc là
Box<Integer> integerBox = new Box<Integer>(); integerBox.set(10); Integer someInteger = integerBox.get();
Generics cũng có thể được sử dụng với các giao diện và phương thức. Chúng cho phép bạn viết mã có thể được sử dụng với các loại object khác nhau và giúp dễ dàng bắt lỗi loại tại thời điểm biên dịch hơn là trong thời gian chạy.
Java cũng có ký tự đại diện, được biểu thị bằng “?” để hỗ trợ loại chung phức tạp hơn và làm cho nó dễ dàng hơn. Ký tự đại diện trong java được sử dụng với phần mở rộng và siêu.
Tại sao sử dụng Generic trong Java
Có một số lý do để sử dụng thuốc generic trong Java:
Loại an toàn: Một trong những ưu điểm chính của việc sử dụng thuốc generic là chúng cho phép bạn chỉ định loại đối tượng hoặc lớp, điều này có thể giúp ngăn ngừa lỗi loại tại thời điểm biên dịch. Điều này làm cho mã của bạn mạnh mẽ hơn và ít bị lỗi thời gian chạy hơn.
Khả năng sử dụng lại: Khi bạn sử dụng generic, bạn có thể viết một lớp hoặc phương thức duy nhất có thể được sử dụng với nhiều loại đối tượng, thay vì phải viết một phiên bản riêng cho từng loại. Điều này làm cho mã của bạn có thể tái sử dụng và bảo trì nhiều hơn.
Khả năng đọc được cải thiện: Sử dụng khái quát làm cho mã của bạn dễ đọc hơn bằng cách làm rõ loại đối tượng mà một lớp hoặc phương thức có thể làm việc cùng, điều này có thể giúp các nhà phát triển khác hiểu cách sử dụng nó.
Hiệu suất tốt hơn: Một số lớp dựng sẵn của Java như ArrayList, LinkedList, v.v. sử dụng các tổng quát giúp JVM thực hiện kiểm tra kiểu khi chạy, điều này có thể dẫn đến hiệu suất được cải thiện vì nó có thể bỏ qua kiểm tra kiểu trong thời gian chạy.
Tổ chức mã tốt hơn và trừu tượng hóa. Sử dụng generic cho phép tạo các lớp và phương thức trừu tượng và linh hoạt hơn, ít bị ghép nối với một kiểu cụ thể hơn và cho phép thiết kế rõ ràng hơn, dễ sử dụng và bảo trì.
Generics là một tính năng mạnh mẽ của Java cho phép bạn viết mã linh hoạt hơn và có thể tái sử dụng, cũng an toàn hơn về kiểu và dễ đọc hơn. Nó được sử dụng rộng rãi trong thư viện chuẩn Java và trong nhiều khung và thư viện Java phổ biến, đồng thời có thể là một công cụ có giá trị để các nhà phát triển sử dụng trong mã của riêng họ.
Các loại Generic class trong java
Trong Java, có hai loại class generic chính: kiểu thô và kiểu được tham số hóa.
- Các loại Raw (thô): Loại thô là một lớp chung không được tham số hóa với một loại cụ thể. Ví dụ: nếu bạn có một lớp chung gọi là “Box”, thì kiểu thô của lớp này sẽ là “Box”. Điều này có nghĩa là lớp có thể chứa bất kỳ loại đối tượng nào và loại đối tượng không được chỉ định.
Box rawBox = new Box();
Không nên sử dụng các kiểu thô vì chúng có thể gây ra các vấn đề về an toàn kiểu, vì không có kiểm tra thời gian biên dịch các kiểu đối tượng được lưu trữ trong lớp.
- Các loại Parameterized Types(được tham số hóa): Một loại được tham số hóa là một lớp generic được tham số hóa với một loại cụ thể. Ví dụ: nếu bạn có một lớp generic gọi là “Box” và bạn muốn tạo một Box chỉ chứa các số nguyên, bạn sẽ tạo một kiểu tham số của lớp, chẳng hạn như:
Box<Integer> integerBox = new Box<Integer>();
Ở đây, “Box<Integer>” là một loại tham số của lớp Box, trong đó “Integer” là tham số loại cụ thể. Điều này có nghĩa là lớp chỉ có thể chứa các số nguyên và mọi nỗ lực lưu trữ một đối tượng thuộc loại khác sẽ gây ra lỗi thời gian biên dịch. Điều này làm cho mã an toàn hơn và ít bị lỗi thời gian chạy hơn.
Bạn có thể sử dụng các loại được tham số hóa cho các loại khác nhau, như string, Double, v.v.
Java cũng cho phép sử dụng các ký tự đại diện trong lớp chung, giúp mở rộng tính linh hoạt của việc sử dụng các lớp chung. Ký tự đại diện “?” có thể đại diện cho bất kỳ loại nào, điều này hữu ích khi bạn muốn cho phép bất kỳ loại nào trong một lớp hoặc phương thức, chẳng hạn như trường Box tạo một phương thức in bất kỳ loại Box nào mà không cần biết trước loại Box đó.
public static void printBox(Box<?> box) { System.out.println(box.get()); }
Bạn nên sử dụng các kiểu được tham số hóa để nhận được nhiều lợi ích nhất khi sử dụng các kiểu chung trong Java và ngăn ngừa các vấn đề về an toàn kiểu.