幾個在JDK1.5中新的語言特徵
幾個在JDK1.5中新的語言特徵:
泛型(Generics)--為集合(collections)提供編譯時型別安全,無需每刻從Collections取得一個物件就進行強制轉換(cast)
增強的“for”迴圈(Enhanced For loop)--減少迭代器(iterator)的潛在錯誤(error-proneness)
自動置入/自動取出(Autoboxing/unboxing)--無需在基本型別(primitive types)(例如double)和包裝型別(wrapper types)(例如Double)之間人工地進行轉換。
型別安全的列舉(Typesafeenums)--提供型別安全列舉模式的各項好處。
靜態匯入(Static import)--無需在使用其他類的靜態成員變數字首其類名.這將使得程式碼更為簡潔。
後設資料(Metadata)--使程式設計人員避免編寫樣板化程式碼(boiler plate code),並提供機會進行宣告式程式設計(declarative programming)。
讓我們詳細討論每個新特性,並看一些例子。
泛型(Generics)
泛型是JDK1.5中一個最“酷”的特徵。通過引入泛型,我們將獲得編譯時型別的安全和執行時更小地丟擲ClassCastExceptions的可能。在JDK1.5中,你可以宣告一個集合將接收/返回的物件的型別。在JDK1.4中,建立僱員名字的清單(List)需要一個集合物件,像下面的語句:
List listOfEmployeeName = new ArrayList();
在JDK1.5中,你將使用下面語句
List<String> listOfEmployeeName = new ArrayList<String>();
最“酷”的是,如果你試圖插入非string型別的值,你將在編譯時發現並且修正這類問題。沒有泛型,你會發現這樣一個bug,當你的客戶呼叫後會告訴你,你所編寫的程式丟擲ClassCastException異常而崩潰。
另外,當你從集合中得到一個元素時你無需進行強制轉換。故原先為:
String employeeName = ((String) listOfEmployee.get(i));
而下面的語句將比上面的更加簡單:
String employeeName = listOfEmployee.get(i);
不清楚物件的型別而強制轉換物件是不合理的,並且更重要的是,它將在執行時失敗。假使使用者無意間傳入一個包含string buffers型別而非string型別的集合,那結果會怎樣呢。在Listing A中,客戶被要求傳入一個編譯器無法強制的strings型別集合。Listing B中顯示了同樣的方法使用泛型是如何實現的。
現在,通過方法簽名可以清楚知道輸入集合必須只能包含strings。如果客戶試圖傳入一個包含string buffers的集合,程式將不會編譯。同時注意,該方法不包含任何強制轉換。它只需要短短一行,一旦你習慣泛型後,它也更加清晰。
在JDK當前版本下的For迴圈語法如下:
現在,用增強的For語句實現相同方法:
在這類For迴圈中,你應該將":"看成"in",所以,在該例中可以看成"for Object o in c"。你可以發現這種For迴圈更具可讀性。
自動置入/自動取出(Autoboxing/unboxing)
Java有基本資料型別,在這些基本資料型別周圍又有包裝類。通常,程式設計人員需要將一種型別轉換成另一種。看看Listing C.中的程式碼片斷。
請注意,用於計算ageAfterTenYear的內迴圈程式碼看上去是多麼雜亂。現在,在Listing D.中看看相同的程式使用autoboxing重寫後的樣子。
有一件事值得注意的:在先前,如果你取出(unbox)Null值,它將變為0。在次程式碼中,編譯器將自動地轉換Integer為int然後加上10,接著將其轉換回Integer.。
型別安全的列舉(Typesafeenums)
型別安全列舉提供下列特性:
他們提供編譯時型別安全。
他們都是物件,因此你不需要將他們放入集合中。
他們作為一種類的實現,因此你可以新增一些方法。
他們為列舉型別提供了合適的名稱空間。
他們列印的值具有情報性(informative)― 如果你列印一個整數列舉(intenum),你只是看見一個數字,它可能並不具有情報性。
例一:
例二:
靜態匯入(Static import)
靜態匯入使程式碼更易讀。通常,你要使用定義在另一個類中的常量(constants),像這樣:
當時使用靜態匯入,我們無需為常量名字首類名就能使用這些常量,像這樣:
後設資料(Metadata)
後設資料特徵志於使開發者們藉助廠商提供的工具可以進行更簡易的開發。看一看Listing E.中的程式碼。
通過後設資料的支援,你可以改寫Listing E中的程式碼為:
正像你所看到的,所有樣板化的程式碼都不見了。
這些新特性和規格說明將在JDK1.5中實現。它將提供Java程式設計社群更多的選擇以編寫魯棒的、可擴充套件的程式碼。認真的Java程式設計人員將感到著手去熟悉這一Java程式語言的新版本是很有益的。
泛型(Generics)--為集合(collections)提供編譯時型別安全,無需每刻從Collections取得一個物件就進行強制轉換(cast)
增強的“for”迴圈(Enhanced For loop)--減少迭代器(iterator)的潛在錯誤(error-proneness)
自動置入/自動取出(Autoboxing/unboxing)--無需在基本型別(primitive types)(例如double)和包裝型別(wrapper types)(例如Double)之間人工地進行轉換。
型別安全的列舉(Typesafeenums)--提供型別安全列舉模式的各項好處。
靜態匯入(Static import)--無需在使用其他類的靜態成員變數字首其類名.這將使得程式碼更為簡潔。
後設資料(Metadata)--使程式設計人員避免編寫樣板化程式碼(boiler plate code),並提供機會進行宣告式程式設計(declarative programming)。
讓我們詳細討論每個新特性,並看一些例子。
泛型(Generics)
泛型是JDK1.5中一個最“酷”的特徵。通過引入泛型,我們將獲得編譯時型別的安全和執行時更小地丟擲ClassCastExceptions的可能。在JDK1.5中,你可以宣告一個集合將接收/返回的物件的型別。在JDK1.4中,建立僱員名字的清單(List)需要一個集合物件,像下面的語句:
List listOfEmployeeName = new ArrayList();
在JDK1.5中,你將使用下面語句
List<String> listOfEmployeeName = new ArrayList<String>();
最“酷”的是,如果你試圖插入非string型別的值,你將在編譯時發現並且修正這類問題。沒有泛型,你會發現這樣一個bug,當你的客戶呼叫後會告訴你,你所編寫的程式丟擲ClassCastException異常而崩潰。
另外,當你從集合中得到一個元素時你無需進行強制轉換。故原先為:
String employeeName = ((String) listOfEmployee.get(i));
而下面的語句將比上面的更加簡單:
String employeeName = listOfEmployee.get(i);
不清楚物件的型別而強制轉換物件是不合理的,並且更重要的是,它將在執行時失敗。假使使用者無意間傳入一個包含string buffers型別而非string型別的集合,那結果會怎樣呢。在Listing A中,客戶被要求傳入一個編譯器無法強制的strings型別集合。Listing B中顯示了同樣的方法使用泛型是如何實現的。
1 |
Listing A (Collection employeeNameList, String name) (Iteratori = (); (); ) String s = (String) (); ((name)) ; ; Listing B (Collection<String> employeeNameList, String name) (Iteratori = (); (); ) (().(name)) ; ; |
現在,通過方法簽名可以清楚知道輸入集合必須只能包含strings。如果客戶試圖傳入一個包含string buffers的集合,程式將不會編譯。同時注意,該方法不包含任何強制轉換。它只需要短短一行,一旦你習慣泛型後,它也更加清晰。
在JDK當前版本下的For迴圈語法如下:
1 |
(Collection c) (Iteratori = (); (); ) Employee emp = (Employee)(); (()); |
現在,用增強的For語句實現相同方法:
1 |
(Collection c) (Object o : c) ((TimerTask)o).()); |
在這類For迴圈中,你應該將":"看成"in",所以,在該例中可以看成"for Object o in c"。你可以發現這種For迴圈更具可讀性。
自動置入/自動取出(Autoboxing/unboxing)
Java有基本資料型別,在這些基本資料型別周圍又有包裝類。通常,程式設計人員需要將一種型別轉換成另一種。看看Listing C.中的程式碼片斷。
1 |
Listing C Employee Integer CHILD = (); (String args[]) n=; Integer age= (); Integer ageAfterTenYear= (age.intValue ); |
請注意,用於計算ageAfterTenYear的內迴圈程式碼看上去是多麼雜亂。現在,在Listing D.中看看相同的程式使用autoboxing重寫後的樣子。
1 |
Listing D Employee (String args[]) n=; Integer age= (); Integer ageAfterTenYear= age ; |
有一件事值得注意的:在先前,如果你取出(unbox)Null值,它將變為0。在次程式碼中,編譯器將自動地轉換Integer為int然後加上10,接著將其轉換回Integer.。
型別安全的列舉(Typesafeenums)
型別安全列舉提供下列特性:
他們提供編譯時型別安全。
他們都是物件,因此你不需要將他們放入集合中。
他們作為一種類的實現,因此你可以新增一些方法。
他們為列舉型別提供了合適的名稱空間。
他們列印的值具有情報性(informative)― 如果你列印一個整數列舉(intenum),你只是看見一個數字,它可能並不具有情報性。
例一:
1 |
Season winter, spring, summer, fall |
例二:
1 |
Coin (), (), (), (); ( value) this.value = value; value; () value; |
靜態匯入(Static import)
靜態匯入使程式碼更易讀。通常,你要使用定義在另一個類中的常量(constants),像這樣:
1 |
org.yyy.pkg.Increment; Employee Double (Double salary salary + Increment.INCREMENT * salary; |
當時使用靜態匯入,我們無需為常量名字首類名就能使用這些常量,像這樣:
1 |
org.yyy.pkg.Increment; Employee Double (Double salary salary + INCREMENT * salary; |
後設資料(Metadata)
後設資料特徵志於使開發者們藉助廠商提供的工具可以進行更簡易的開發。看一看Listing E.中的程式碼。
1 |
Listing E importorg.yyy.hr; EmployeeI Java.rmi.Remote String () throwsJava.rmi.RemoteException; String getLocation () throwsJava.rmi.RemoteException; |
1 |
EmployeeImpl EmployeeI String () String getLocation () |
通過後設資料的支援,你可以改寫Listing E中的程式碼為:
1 |
importorg.yyy.hr; Employee @Remote String () ... @Remote String () ... |
正像你所看到的,所有樣板化的程式碼都不見了。
這些新特性和規格說明將在JDK1.5中實現。它將提供Java程式設計社群更多的選擇以編寫魯棒的、可擴充套件的程式碼。認真的Java程式設計人員將感到著手去熟悉這一Java程式語言的新版本是很有益的。
相關文章
- JDK1.5中新的語言特徵JDK特徵
- 在我眼裡的幾種語言
- C語言的幾個關鍵字C語言
- fpcx教程:在Final Cut Pro中新增多語言字幕
- 高階語言實現的幾個點
- C語言學習的幾個階段C語言
- go語言reflect包使用的幾個場景Go
- 函數語言程式設計的幾個概念函數程式設計
- 你應該知道Go語言的幾個優勢Go
- C語言初學者最常問的幾個問題C語言
- python語言幾個常見函式的使用Python函式
- 這個專案可以讓你在幾分鐘快速瞭解某個程式語言
- 轉:JDK1.5新語法JDK
- 各種語言按鈕事件特徵碼事件特徵
- 成功創業者的15個特徵 你擁有幾個?創業特徵
- Golang語言排序的幾種方式Golang排序
- 在本地跑一個大語言模型模型
- 排行榜裡那些語言,你到底會幾個?
- 幾種常用程式語言的區別
- 幾種程式語言的優缺點
- 簡單給初學者說說JAVA語言的幾個特點Java
- 一個神奇的網站,幾分鐘學會某程式語言網站
- 如何開始程式語言?給初學者的幾個小貼士
- 特徵值與特徵向量的幾何含義(轉)特徵
- 在同一個頁面中新增多個CollectionViewView
- C語言——幾道習題C語言
- Python程式語言有哪些特徵?入門分享!Python特徵
- 為什麼《七週七語言》選中的是這幾種語言?
- 幾種計算機語言的評價計算機
- 語音的關鍵聲學特徵(語音情感特徵提取)特徵
- Python學習中:最感到驚奇35個語言特徵和程式設計技巧Python特徵程式設計
- js如何動態在div中新增一個新的元素JS
- ASP程式中常使用的幾種指令碼語言指令碼
- 有幾點關於C語言的疑問C語言
- 幾十種程式語言的快速入門教程
- 幾乎所有程式語言的hello, world程式(1)
- 幾乎所有程式語言的hello, world程式(2)
- 幾乎所有程式語言的hello, world程式(3)