Danh mục

Java Generic

Số trang: 16      Loại file: pdf      Dung lượng: 141.96 KB      Lượt xem: 16      Lượt tải: 0    
Thư viện của tui

Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Đó là điểm mới về mặt ngôn ngữ từ java 5. Mặc dù đã sử dụng Generic khá thành thạo từ lâu nhưng đến nay tôi mới có dịp đề cập về nó một cách chi tiết hơn. Một ưu điểm mà người ta thường nhắc tới chính là dùng Generic có thể hạn chế được các lỗi trong ép kiểu. Không biết nên bắt đầu từ đâu nhỉ ? Có lẽ nên bắt đầu từ Collections Framework, một trong những gói được cài đặt generic nhiều nhất ở Java 5. Container với Generic. Bạn hay dùng List, cụ thể...
Nội dung trích xuất từ tài liệu:
Java Generic Java GenericĐó là điểm mới về mặt ngôn ngữ từ java 5. Mặc dù đã sử dụng Generic khá thành thạo từ lâunhưng đến nay tôi mới có dịp đề cập về nó một cách chi tiết hơn.Một ưu điểm mà người ta thường nhắc tới chính là dùng Generic có thể hạn chế được các lỗitrong ép kiểu. Không biết nên bắt đầu từ đâu nhỉ ? Có lẽ nên bắt đầu từ CollectionsFramework, một trong những gói được cài đặt generic nhiều nhất ở Java 5.Container với Generic.Bạn hay dùng List, cụ thể nhất với những người mới làm quen với java là Vector. Vector giốngnhư một mảng động được cài đặc các functions từ List interface. Tuy nhiên, Vector cósynchronized, do đó vận dụng Vector một các bừa bãi có thể làm cho code java chạy chậmhơn rất nhiều, sử dụng người anh em của nó là ArrayList và LinkedList trong những trườnghợp không cần synchronized sẽ nhanh hơn. Nhưng xin được cài đặt thử vài dòng với Vector vìnó khá quen với nhiều người.Vector là một mảng động, một mảng các Object (Collections Framework trong JDK của Sunkhông hỗ trợ primary type). Do đó, nếu khai báo như sau thì bạn có thể chứa bất cứ kiểu dữliệu nào được extends từ Object : Vector exam = new Vector();Trong lập trình, chúng ta thường chứa một mảng dữ liệu cùng kiểu, chẳng hạn một Vectorchứa các String hoặc integer. Ví dụ : exam.add(new Integer(1));Do đó khi lấy lại dữ liệu chúng ta phải thực hiện việc ép kiểu, ví dụ: Integer intg = (Integer)exam.get(0);Ở những phiên bản trước, lập trình viên bắt buộc phải ép kiểu dữ liệu trả về từ mộtcollection, điều trên thực sự là hơi bất tiện và không cần thiết với một ngôn ngữ. Hơn nữaviệc ép kiểu có thể ném ra lỗi bởi dữ liệu trả về không thuộc kiểu dữ liệu mà bạn cần lấy.Chẳng hạn exam.add(“4”); và lấy lại dữ liệu Integer intg2 = (Integer)exam.get(1);. Khi đó,một lỗi runtime xảy ra. Trong lập trình, lỗi có thể xảy ra ở thời điểm compile (chủ yếu là lỗi vềcú pháp) và lỗi xảy ra lúc runtime. Những lỗi xảy ra ở thời điểm chạy chương trình thường lànhững lỗi khó debug, NullPointerException là một ví dụ và ClassCastException cũng rấtthường gặp. Trong một vài cài đặt, chúng trở thành những lỗi cứng đầu nhất với lập trìnhviên.Generic đã khắc phục được điểm yếu đó, dĩ nhiên 100% thì không thể khẳng định đượcnhưng việc cài đặt Generic có thể hạn chế được tối đa các lỗi ClassCastException. Chẳng hạn,bây giờ bạn có thể viết như sau: Vector exam = new Vector(); exam.add(1);Khai báo một vector dùng để chứa các giá trị kiểu Integer. Khi đó, ở bất cứ đâu nếu tôi đưadữ liệu dưới dạng khác, chẳng hạn exam.add(“4”); thì compiler sẽ báo lỗi ngay ở lúc biêndịch chương trình và coi đó như một lỗi cú pháp. Bạn đừng ngạc nhiên khi tôi viếtexam.add(1);, thực ra thì số 1 thuộc kiểu int, một primary type chứ không phải là Integer –một kiểu dữ liệu đối tượng. Tuy nhiên trong java 5 có cài đặt Boxing - Unboxing nên chúng tacó thể mặc nhiên sử dụng ở một số hoàn cảnh các giá trị kiểu int giống như là Integer vàngược lại.Nếu dữ liệu ở nhiều kiểu đối tượng khác nhau thì generic có thể khai báo ở dạng cha, tức làkiểu đối tượng chung nhất mà chúng extend. Chẳng hạn, nếu muốn tạo một vector chứa dữliệu ở dạng string hoặc integer tôi có thể dùng Object, khai báo như sau: Vector exam = new Vector();Nhưng khi muốn lấy lại chính xác dữ liệu thuộc kiểu String hoặc integer bạn vẫn phải dùng épkiểu, do đó, có thể không cần khai báo generic : Vector exam = new Vector(). Khi biên dịch,bạn sẽ nhận được một thông báo về việc sự an toàn khi thực hiện các phép toán trên dữ liệu.Nếu không muốn nhận lại sự thông báo này có thể khai báo một annotation là@SuppressWarnings(unchecked). Cụ thể một hàm main nhỏ sẽ viết như sau: @SuppressWarnings(unchecked) public static void main(String[] args) { Vector exam = new Vector(); exam.add(1); }tìm ra kiểu chung gần nhất để khai báo generic cho những loại dữ liệu có thể được lưu trữtrong collection là một cách nhằm giảm bớt lỗi runtime ngay từ lúc compile, chẳng hạn nếumuốn khai báo một vector chứa dữ liệu kiểu Integer hoặc Long tôi có thể chọn kiểu chogeneric là Number bởi cả Long và Integer đều được extend từ lớp này. Cụ thể như sau : Vector exam = new Vector(); exam.add(1);Khi đó, nếu ở đâu đó, tôi có vô tình add một số dưới dạng string thì một lỗi ngữ pháp sẽthông báo cho tôi biết ngay sau khi tôi compile class đó.Nếu phải cài đặt container, tốt nhất là nên cài đặt generic, điều này sẽ giúp container của bạnđược linh hoạt và có thể tránh được các lỗi về ép kiểu dữ liệu trên các phép toán. Chẳng hạn,tôi cài một stack như sau: public class Stack { private Node stack = null; public T pop( ) { T result = stack.value; stack = stack.next; return result; } public boolean hasNext(){ return stack != null; } public void push(T v) { stack ...

Tài liệu được xem nhiều: