日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
JDK1.5中新的語言特征淺析

本文中,我們將討論幾個在JDK1.5中新的語言特征,包括:

在JDK1.5中泛型(Generics)--為集合(collections)提供編譯時類型安全,無需每刻從Collections取得一個對象就進行強制轉(zhuǎn)換(cast)

在JDK1.5中增強的“for”循環(huán)(Enhanced For lOOp)--減少迭代器(iterator)的潛在錯誤(error-proneness)

在JDK1.5中自動置入/自動取出(Autoboxing/unboxing)--無需在基本類型(primitive types)(例如double)和包裝類型(wrapper types)(例如Double)之間人工地進行轉(zhuǎn)換。

在JDK1.5中類型安全的枚舉(Typesafeenums)--提供類型安全枚舉模式的各項好處。

在JDK1.5中靜態(tài)導(dǎo)入(Static import)--無需在使用其他類的靜態(tài)成員變量前綴其類名.這將使得代碼更為簡潔。

在JDK1.5中元數(shù)據(jù)(Metadata)--使編程人員避免編寫樣板化代碼(boiler plate code),并提供機會進行宣告式程式設(shè)計(declarative programming)。

讓我們詳細討論每個新特性,并看一些例子。

◆泛型(Generics)

泛型是JDK1.5中一個最“酷”的特征。通過引入泛型,我們將獲得編譯時類型的安全和運行時更小地拋出ClassCastExceptions的可能。在JDK1.5中,你可以聲明一個集合將接收/返回的對象的類型。在JDK1.4中,創(chuàng)建雇員名字的清單(List)需要一個集合對象,像下面的語句:

List listOfEmployeeName = new ArrayList();

在JDK1.5中,你將使用下面語句

 
 
 
  1. List listOfEmployeeName = new ArrayList();

最“酷”的是,如果你試圖插入非string類型的值,你將在編譯時發(fā)現(xiàn)并且修正這類問題。沒有泛型,你會發(fā)現(xiàn)這樣一個bug,當你的客戶調(diào)用后會告訴你,你所編寫的程序拋出ClassCastException異常而崩潰。

另外,當你從集合中得到一個元素時你無需進行強制轉(zhuǎn)換。故原先為:

 
 
 
  1. String employeeName = ((String) listOfEmployee.get(i));

而下面的語句將比上面的更加簡單:

 
 
 
  1. String employeeName = listOfEmployee.get(i);

不清楚對象的類型而強制轉(zhuǎn)換對象是不合理的,并且更重要的是,它將在運行時失敗。假使用戶無意間傳入一個包含string buffers類型而非string類型的集合,那結(jié)果會怎樣呢。在Listing A中,客戶被要求傳入一個編譯器無法強制的strings類型集合。Listing B中顯示了同樣的方法使用泛型是如何實現(xiàn)的。

Listing A

 
 
 
  1. staticbOOleancheckName(Collection employeeNameList, String name) {
  2.  for (Iteratori = employeeNamList.iterator(); i.hasNext(); ) {
  3. String s = (String) i.next();
  4. if(s.equals(name)){
  5.  return true;
  6. //print employee name here ......
  7. }
  8. }
  9. return false;
  10. }

Listing B

 
 
 
  1. staticbooleancheckName(Collection employeeNameList, String name) {
  2. for (Iteratori = employeeNamList.iterator(); i.hasNext(); ) {
  3.  if(i.next().equals(name)){
  4.  return true;
  5.  //print employee name here ......
  6.  }
  7.  }
  8. return false;
  9. }

現(xiàn)在,通過方法簽名可以清楚知道輸入集合必須只能包含strings。如果客戶試圖傳入一個包含string buffers的集合,程序?qū)⒉粫幾g。同時注意,該方法不包含任何強制轉(zhuǎn)換。它只需要短短一行,一旦你習(xí)慣泛型后,它也更加清晰。

在jdk當前版本下的For循環(huán)語法如下:

 
 
 
  1. void printAll(Collection c) {
  2.   for (Iteratori = c.iterator(); i.hasNext(); ) {
  3.   Employee emp = (Employee)i.next();
  4.   System.out.println(emp.getName());
  5.   }
  6. }

◆用增強的For語句實現(xiàn)相同方法:

 
 
 
  1. voidprintAll(Collection c) {
  2.   for (Object o : c)
  3.   System.out.println((TimerTask)o).getName());
  4. }

在這類For循環(huán)中,你應(yīng)該將":"看成"in",所以,在該例中可以看成"for Object o in c"。你可以發(fā)現(xiàn)這種For循環(huán)更具可讀性。

◆在JDK1.5中自動置入/自動取出(Autoboxing/unboxing)

Java有基本數(shù)據(jù)類型,在這些基本數(shù)據(jù)類型周圍又有包裝類。通常,編程人員需要將一種類型轉(zhuǎn)換成另一種??纯碙isting C.中的代碼片斷。

Listing C

 
 
 
  1. public class Employee {
  2. private static final Integer CHILD = new Integer(0);
  3. public static void main(String args[]) {
  4. //code for adding n to an Integer
  5. int n=10;
  6. Integer age= new Integer(30);
  7. Integer ageAfterTenYear= new Integer(age.intValue +10);
  8. }
  9. }

請注意,用于計算ageAfterTenYear的內(nèi)循環(huán)代碼看上去是多么雜亂?,F(xiàn)在,在Listing D.中看看相同的程序使用autoboxing重寫后的樣子。

Listing D

 
 
 
  1. public class Employee {
  2.   public static void main(String args[]) {
  3.  int n=10;
  4.  Integer age= new Integer(30);
  5.  Integer ageageAfterTenYear= age +10;
  6.   }
  7. }

有一件事值得注意的:在先前,如果你取出(unbox)Null值,它將變?yōu)?。在次代碼中,編譯器將自動地轉(zhuǎn)換Integer為int然后加上10,接著將其轉(zhuǎn)換回Integer.。

◆在JDK1.5中類型安全的枚舉(Typesafeenums)

類型安全枚舉提供下列特性:

他們提供編譯時類型安全。

他們都是對象,因此你不需要將他們放入集合中。

他們作為一種類的實現(xiàn),因此你可以添加一些方法。

他們?yōu)槊杜e類型提供了合適的命名空間。

他們打印的值具有情報性(informative)— 如果你打印一個整數(shù)枚舉(intenum),你只是看見一個數(shù)字,它可能并不具有情報性。

例一:

 
 
 
  1. enum Season { winter, spring, summer, fall }

例二:

 
 
 
  1. public enum Coin {
  2.   penny(1), nickel(5), dime(10), quarter(25);
  3.   Coin(int value) { this.value = value; }
  4.   private final int value;
  5.   public int value() { return value; }
  6. }

◆在JDK1.5中靜態(tài)導(dǎo)入(Static import)

靜態(tài)導(dǎo)入使代碼更易讀。通常,你要使用定義在另一個類中的常量(constAnts),像這樣:

 
 
 
  1. importorg.yyy.pkg.Increment;
  2. class Employee {
  3.   public Double calculateSalary(Double salary{
  4.  return salary + Increment.INCREMENT * salary;
  5.   }
  6. }

當時使用靜態(tài)導(dǎo)入,我們無需為常量名前綴類名就能使用這些常量,像這樣:

 
 
 
  1. import static org.yyy.pkg.Increment;
  2. class Employee {
  3.   public Double calculateSalary(Double salary{
  4.   return salary + INCREMENT * salary;
  5.   }
  6. }

注意,我們可以調(diào)用INCREMENT這一常量而不要使用類名Increment.。

◆元數(shù)據(jù)(Metadata)

元數(shù)據(jù)特征志于使開發(fā)者們借助廠商提供的工具可以進行更簡易的開發(fā)??匆豢碙isting E.中的代碼。

Listing E

 
 
 
  1. importorg.yyy.hr;
  2. public interface EmployeeI extends java.rmi.Remote {
  3.   public String getName()
  4.   throwsjava.rmi.RemoteException;
  5.   public String getLocation ()
  6.   throwsjava.rmi.RemoteException;
  7. }
  8. public class EmployeeImpl implements EmployeeI {
  9.   public String getName(){
  10.   }
  11.   public String getLocation (){
  12.   }
  13. }

通過元數(shù)據(jù)的支持,你可以改寫Listing E中的代碼為:

 
 
 
  1. importorg.yyy.hr;
  2. public class Employee {
  3.   @Remote public String getName() {
  4.   ...
  5.   }
  6.   @Remote public public String getLocation() {
  7.   ...
  8.   }
  9. }

正像你所看到的,所有樣板化的代碼都不見了。

在JDK1.5中這些新特性和規(guī)格說明將實現(xiàn)。它將提供Java編程社區(qū)更多的選擇以編寫魯棒的、可擴展的代碼。認真的Java編程人員將感到著手去熟悉這一Java編程語言的新版本是很有益的。希望這些對于JDK1.5特性的信息對你在編程時起到引導(dǎo)作用。


標題名稱:JDK1.5中新的語言特征淺析
網(wǎng)站網(wǎng)址:http://www.dlmjj.cn/article/dhoisjo.html