java 5.0發布了,許多人都將開始使用這個JDK版本的一些新增特性。從增強的for循環到諸如泛型(generic)之類更復雜的特性,都將很快出現在您所編寫的代碼中。我們剛剛完成了一個基于Java 5.0的大型任務,而本文就是要介紹我們使用這些新特性的體驗。本文不是一篇入門性的文章,而是對這些特性以及它們所產生的影響的深入介紹,同時還給出了一些在項目中更有效地使用這些特性的技巧。
簡介
在JDK 1.5的beta階段,我們為BEA的Java IDE開發了一個Java 5編譯器。因為我們實現了許多新特性,所以人們開始以新的方式利用它們;有些用法很聰明,而有些用法明顯應該被列入禁用清單。編譯器本身使用了新的語言特性,所以我們也獲得了使用這些特性維護代碼的直接體驗。本文將介紹其中的許多特性和使用它們的體驗。
我們假定您已經熟悉了這些新特性,所以不再全面介紹每個特性,而是談論一些有趣的、但很可能不太明顯的內容和用法。這些技巧出自我們的實際體驗,并大致按照語言特性進行了分類。
我們將從最簡單的特性開始,逐步過渡到高級特性。泛型所包含的內容非凡豐富,因此占了本文一半的篇幅。
增強的for循環
為了迭代集合和數組,增強的for循環提供了一個簡單、兼容的語法。有兩點值得一提:
Init表達式
在循環中,初始化表達式只計算一次。這意味著您通??梢砸瞥粋€變量聲明。在這個例子中,我們必須創建一個整型數組來保存computeNumbers()的結果,以防止每一次循環都重新計算該方法。您可以看到,下面的代碼要比上面的代碼整潔一些,并且沒有泄露變量numbers:
未增強的For:int sum = 0;Integer[] numbers = computeNumbers();for (int i=0; i < numbers.length ; i++) sum += numbers[i];增強后的For: int sum = 0;for ( int number: computeNumbers() ) sum += number;
局限性
有時需要在迭代期間訪問迭代器或下標,看起來增強的for循環應該答應該操作,但事實上不是這樣,請看下面的例子:
for (int i=0; i < numbers.length ; i++) { if (i != 0) System.out.我們希望將數組中的值打印為一個用逗號分隔的清單。我們需要知道目前是否是第一項,以便確定是否應該打印逗號。使用增強的for循環是無法獲知這種信息的。我們需要自己保留一個下標或一個布爾值來指示是否經過了第一項。 這是另一個例子:
for (Iterator<integer> it = n.iterator() ; it.hasNext() ; ) if (it.next() < 0) it.remove();在此例中,我們想從整數集合中刪除負數項。為此,需要對迭代器調用一個方法,但是當使用增強的for 循環時,迭代器對我們來說是看不到的。因此,我們只能使用Java 5之前版本的迭代方法。 順便說一下,這里需要注重的是,由于Iterator是泛型,所以其聲明是Iterator<Integer>。許多人都忘記了這一點而使用了Iterator的原始格式。
注釋
注釋處理是一個很大的話題。因為本文只關注核心的語言特性,所以我們不打算涵蓋它所有的可能形式和陷阱?! ∥覀儗⒂懻搩戎玫淖⑨專⊿uppressWarnings,Deprecated和Override)以及一般注釋處理的局限性。Suppress Warnings
該注釋關閉了類或方法級別的編譯器警告。有時候您比編譯器更清楚地知道,代碼必須使用一個被否決的方法或執行一些無法靜態確定是否類型安全的動作,而使用:@SuppressWarnings("deprecation")public static void selfDestrUCt() { Thread.currentThread().stop();}這可能是內置注釋最有用的地方。遺憾的是,1.5.0_04的javac不支持它。但是1.6支持它,并且Sun正在努力將其向后移植到1.5中。
Eclipse 3.1中支持該注釋,其他IDE也可能支持它。這答應您把代碼徹底地從警告中解脫出來。假如在編譯時出現警告,可以確定是您剛剛把它添加進來——以幫助查看那些可能不安全的代碼。隨著泛型的添加,它使用起來將更趁手。Deprecated
遺憾的是,Deprecated沒那么有用。它本來旨在替換@deprecated javadoc標簽,但是由于它不包含任何字段,所以也就沒有方法來建議deprecated類或方法的用戶應該使用什么做為替代品。大多數用法都同時需要javadoc標簽和這個注釋。Override
Override表示,它所注釋的方法應該重寫超類中具有相同簽名的方法:@Overridepublic int hashCode() { ...}
新聞熱點
疑難解答