Java: Tổng quan về Generics

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Generics là cách mà Lập trình viên có thể chỉ định kiểu đối tượng mà một lớp có thể làm việc với các tham số được truyền vào lúc khai báo và được đánh giá tại thời điểm biên dịch. Generics có thể được so sánh với các hàm được tham số hóa bởi các biến kiểu và có thể được khởi tạo với các đối số kiểu khác nhau tùy thuộc vào ngữ cảnh.

Tổng quan về Generics

Generics trong lập trình Java tạo ra một phiên bản đã biên dịch của lớp generic. Việc giới thiệu Generics trong các lớp Java sẽ giúp loại bỏ việc ép kiểu tường minh của một đối tượng lớp và vì thế ClassCastException sẽ không phát sinh trong quá trình biên dịch. Generics sẽ giúp loại bỏ sự mâu thuẫn về kiểu trong thời gian biên dịch hơn là trong thời gian chạy. Generics được thêm vào ngôn ngữ lập trình Java vì chúng cho phép:

♦ Nhận thêm thông tin về loại collection.

♦ Theo dõi loại phần tử mà collection chứa.

♦ Sử dụng việc ép kiểu trên toàn bộ chương trình.

Lưu ý - Generics được kiểm tra tại thời điểm biên dịch về tính đúng đắn của kiểu.  Trong Generics, một collection không được coi là danh sách các tham chiếu đến các đối tượng.  Bạn có thể phân biệt sự khác biệt giữa tập hợp các tham chiếu đến số nguyên và byte.  Collection kiểu generic cần một tham số kiểu để  chỉ định kiểu của phần tử được lưu trữ trong collection.

Generic là một thuật ngữ kỹ thuật trong Java biểu thị các tính năng liên quan đến việc sử dụng các phương thức và kiểu generic. Để biết loại phần tử của Collection là động lực chính của việc thêm Generics vào ngôn ngữ lập trình Java thì ta thấy rằng Collection trước đó coi các phần tử như một tập hợp các đối tượng. Để truy xuất một phần tử từ Collection thì ta cần yêu cầu ép kiểu tường mình vì trình biên dịch không thể kiểm tra ép kiểu ngầm định. Do đó, luôn có nguy cơ xảy ra ngoại lệ runtime, ClassCastException, được ném ra nếu bạn ép kiểu không phải là siêu kiểu của kiểu được trích xuất.

Generics cho phép người lập trình giao tiếp loại collection tới trình biên dịch để có thể kiểm tra nó. Do đó, việc sử dụng Generics là an toàn vì trong quá trình biên dịch chương trình, trình biên dịch luôn kiểm tra loại phần tử của collection và chèn đúng kiểu vào các phần tử được đưa ra khỏi collection.

Ví dụ 1 thể hiện đoạn mã non-generic (không dùng generic).

LinkedList list = new LinkedList();
list.add(new Integer(1));
Integer num = (Integer) list.get(0);

Trong ví dụ trên, một thể hiện của danh sách liên kết được tạo. Một phần tử kiểu Integer được thêm vào danh sách. Trong khi truy xuất giá trị từ danh sách, cần phải ép kiểu tường minh.

Ví dụ 2 hiển thị đoạn mã có sử dụng generic.

LinkedList<Integer> list = new LinkedList<Integer>();
list.add(new Integer(1));
Integer num = list.get(0);

Trong ví dụ trên, LinkedList là một lớp generic chấp nhận một tham số kiểu Integer. Trình biên dịch kiểm tra tính đúng đắn của kiểu trong thời gian biên dịch. Không cần thiết phải ép kiểu Integer vì trình biên dịch sẽ chèn đúng kiểu ép vào các phần tử được truy xuất từ ​​danh sách bằng phương thức get().

Ưu điểm và hạn chế của Generic

Ưu điểm của Generics như sau:

  • Generics cho phép tính linh hoạt của liên kết động.
  • Generics giúp trình biên dịch kiểm tra tính đúng kiểu của chương trình tại thời điểm biên dịch.
  • Trong Generics, các lỗi được phát hiện của trình biên dịch ít tốn thời gian hơn để sửa chữa hơn các lỗi thời gian chạy.
  • Việc review code đơn giản hơn trong Generics vì sự không rõ ràng giữa các vùng chứa ít hơn.
  • Trong Generics, mã lệnh chứa ít phần ép kiểu hơn và do đó giúp cải thiện khả năng đọc và độ chắc chắn.

Các hạn chế của Generics như sau:

  • Trong Generics, bạn không thể tạo các hàm tạo generic.
  • Không thể khai báo một biến cục bộ khi các kiểu key và value khác nhau.
» Tiếp: Lớp generic
« Trước: So sánh ArrayList và Vector
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!