Bài viết này sẽ cung cấp cho bạn một cái nhìn toàn diện về Java Generics, một tính năng quan trọng được giới thiệu từ Java 5. Chúng ta sẽ khám phá lý do tại sao generics lại hữu ích, cách chúng giúp bạn viết code an toàn hơn, dễ bảo trì hơn và tái sử dụng code một cách hiệu quả. Nếu bạn đang làm việc với Java Collections hoặc bất kỳ framework nào sử dụng generics, bài viết này sẽ giúp bạn hiểu sâu hơn và tận dụng tối đa sức mạnh của chúng.
Generics cho phép bạn định nghĩa các lớp, interface và method với các tham số kiểu. Điều này có nghĩa là bạn có thể viết code hoạt động với nhiều kiểu dữ liệu khác nhau mà không cần phải viết lại code cho từng kiểu. Điều này giúp giảm thiểu code trùng lặp, tăng tính tái sử dụng và giảm nguy cơ lỗi.
Ví dụ, hãy xem xét một lớp `Box` đơn giản:
class Box<T> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
Ở đây, `T` là một tham số kiểu, có thể được thay thế bằng bất kỳ kiểu cụ thể nào khi bạn tạo một thể hiện của lớp `Box`. Ví dụ:
Box<String> stringBox = new Box<>();
stringBox.setValue("Hello");
Box<Integer> integerBox = new Box<>();
integerBox.setValue(123);
Hãy xem xét một ví dụ về việc sử dụng `ArrayList` trước và sau khi có generics.
**Trước Java 5 (Không có Generics):**
List list = new ArrayList();
list.add("abc");
list.add(new Integer(5));
for (Object obj : list) {
String str = (String) obj; // Ép kiểu, có thể gây ClassCastException
}
**Sau Java 5 (Sử dụng Generics):**
List<String> list = new ArrayList<>();
list.add("abc");
// list.add(new Integer(5)); // Lỗi biên dịch
for (String str : list) {
// Không cần ép kiểu
}
Với generics, trình biên dịch sẽ báo lỗi nếu bạn cố gắng thêm một đối tượng không phải kiểu `String` vào danh sách. Ngoài ra, bạn không cần phải ép kiểu khi lấy các phần tử từ danh sách.
Dấu hỏi chấm (`?`) là ký tự wildcard trong generics, đại diện cho một kiểu không xác định. Wildcards được sử dụng để tăng tính linh hoạt của code generics.
Trong quá trình biên dịch, trình biên dịch Java sẽ loại bỏ tất cả các thông tin kiểu generics. Quá trình này được gọi là "type erasure". Điều này có nghĩa là các kiểu generics chỉ được kiểm tra tại thời điểm biên dịch và không tồn tại trong runtime.
Java Generics là một công cụ mạnh mẽ giúp cải thiện tính an toàn kiểu, tái sử dụng code và khả năng đọc hiểu của code. Bằng cách hiểu và sử dụng generics một cách hiệu quả, bạn có thể viết các ứng dụng Java mạnh mẽ và dễ bảo trì hơn. Hãy khám phá và áp dụng generics vào các dự án của bạn để tận hưởng những lợi ích mà nó mang lại.
Bài viết liên quan