本文中,我們將討論幾個在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 listOfEmployeeName = new ArrayList();
最“酷”的是,假如你試圖插入非string類型的值,你將在編譯時發現并且修正這類問題。沒有泛型,你會發現這樣一個bug,當你的客戶調用后會告訴你,你所編寫的程序拋出ClassCastException異常而崩潰。
另外,當你從集合中得到一個元素時你無需進行強制轉換。故原先為:
String employeeName = ((String) listOfEmployee.get(i));
而下面的語句將比上面的更加簡單:
String employeeName = listOfEmployee.get(i);
不清楚對象的類型而強制轉換對象是不合理的,并且更重要的是,它將在運行時失敗。假使用戶無意間傳入一個包含string buffers類型而非string類型的集合,那結果會怎樣呢。在Listing A中,客戶被要求傳入一個編譯器無法強制的strings類型集合。Listing B中顯示了同樣的方法使用泛型是如何實現的。
Listing A
staticbooleancheckName(Collection employeeNameList, String name) {
for (Iteratori = employeeNamList.iterator(); i.hasNext(); ) {
String s = (String) i.next();
if(s.equals(name)){
return true;
//print employee name here ......
}
}
return false;
}
Listing B
staticbooleancheckName(Collection employeeNameList, String name) {
for (Iteratori = employeeNamList.iterator(); i.hasNext(); ) {
if(i.next().equals(name)){
新聞熱點
疑難解答