×

Sử dụng Generics để xây dựng mã linh hoạt và an toàn trong Java

Generics là một khái niệm quan trọng trong lập trình Java, giúp xây dựng mã linh hoạt và an toàn. Với Generics, lập trình viên có thể tạo ra các lớp, phương thức và cấu trúc dữ liệu mà không phụ thuộc vào các kiểu dữ liệu cụ thể.

Tại sao nên sử dụng Generics?

Sử dụng Generics mang lại nhiều lợi ích, đặc biệt là trong việc kiểm tra kiểu dữ liệu tại thời gian biên dịch, giúp tránh lỗi thời gian chạy. Điều này làm cho mã nguồn của bạn an toàn hơn và dễ bảo trì hơn.

Cơ bản về Generics trong Java

Generics cho phép bạn viết các lớp, giao diện và phương thức với các kiểu thay đổi, giúp bạn tái sử dụng mã nhiều hơn và giảm thiểu các lỗi do sai kiểu dữ liệu.

Khai báo lớp và phương thức Generics

public class Box<T> {
    private T item;

    public void setItem(T item) {
        this.item = item;
    }

    public T getItem() {
        return item;
    }
}

Trong ví dụ này, Box<T> là một lớp Generics với kiểu T là một tham số kiểu. Bạn có thể tạo các đối tượng Box với bất kỳ loại kiểu nào, như Box<Integer> hoặc Box<String>.

Sử dụng Wildcards trong Generics

Wildcards (?) giúp bạn khai báo các loại đối số khác nhau khi sử dụng Generics.

Upper Bounded Wildcards

public void printNumbers(List<? extends Number> list) {
    for (Number number : list) {
        System.out.println(number);
    }
}

Trong trường hợp này, List<? extends Number> có thể là một danh sách các kiểu subclass của Number như Integer, Double, v.v.

Lower Bounded Wildcards

public void addNumbers(List<? super Integer> list) {
    list.add(new Integer(50));
    list.add(new Integer(100));
}

List<? super Integer> có thể là một danh sách các kiểu superclass của Integer như Number hoặc Object.

Generics và Thừa Kế

Generics cũng hỗ trợ thừa kế, giúp bạn dễ dàng tạo các lớp con từ lớp Generics cha.

public class GenericBox<T> {
    private T value;

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

public class StringBox extends GenericBox<String> {
    // Các phương thức và thuộc tính riêng của StringBox
}

StringBox là một lớp con của GenericBox với tham số kiểu T được cố định là String.

Nâng cao với Type Erasure

Type Erasure là quá trình mà thông tin về kiểu dữ liệu được xóa tại thời gian biên dịch, và Java sẽ thay thế các tham số kiểu với các kiểu Object để đảm bảo tương thích ngược.

Kết luận

Generics là một công cụ mạnh mẽ trong Java, giúp bạn viết mã nguồn an toàn và dễ bảo trì hơn. Với khả năng kiểm tra kiểu tại thời gian biên dịch, tránh lỗi thời gian chạy và hỗ trợ tái sử dụng mã, Generics là một yếu tố quan trọng mà mọi lập trình viên Java nên làm quen và sử dụng một cách hiệu quả.

Comments