“JDK 5”的最大的變化是使用諸如範型,for-each循環,自動裝箱/拆箱,枚舉,變參數,靜態引入
(imports)和註釋來簡化開發,其在語言的層次上提供對程序開發更清晰,更簡短和更安全的支持。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
範型,for-each和自動裝箱/拆箱
範型使得你定義集合(collection)的元素類型,其勝於定義一個列表(list),(定義它的內容),像String一樣。舉個例子,下面的代碼使用新的for-each語法來敘述出在一個集合中的TimerTasks的列表,同時注意到其缺少類型變換(casting)和非常容易理解的循環語法。
void cancellAll(Collection c)
{
for (TimerTask task : c)
{
task.cancel();
}
}
在1.4和5.0中,字節碼是一樣的,只不過是轉換一下代碼而已。常聽見一些網友說爲什麼使用:而不使用in呢?這個問題的答案有兩方面的,第一in已經是一個關鍵字了(舉個例子在System.in),同時是不希望引入新的關鍵詞。在JDK 5中只是引入了一個新的關鍵字:enum。
自動裝箱:自動地將int變換爲Integer
拆箱:自動地將Integer變換爲int
舉例如下,你可以很容易地做下面的事情:
Integer i = new Integer(5);
Map map = new HashMap();
map.put("result", i+1);
你會注意到上面的一個例子,先是將Integer類型轉換爲int,然後進行加法,最後又將裝箱爲Integer,並且將其放到Map中去。很酷,是嗎?^_^
JDK 5簡化了反射功能,類class更加通用(generified)了---Foo.class是類型Class。這使得在編譯期能夠類型安全地反射w/o轉換。下面的代碼返回來一個對象以及進行一些必須的變換。
Foo foo = Foo.class.newInstance();
什麼時候將使用範型呢?
隨時都可以使用範型,除非你運行在5.0之前的java虛擬機上面。
什麼時候使用for-each循環?
可以隨時使用,因爲其能夠美化你的代碼,並且使得更加簡單地實現。雖然其爲5.0中最小的新的特性,但是其是人們最喜歡的一個特性。但是在下面的情況下不能使用for-each:
l 在集合中刪除元素(因爲沒有iterator)
l 修改一個數組或者列表的當前的slot(因爲隱藏了index)
l 在多個集合或者數組中iterate
Enums
JDK 5在語言層次上支持枚舉類型。
enum Season { WINTER, SPRING, SUMMER, FALL }
枚舉是可以比較和序列化的。枚舉的常量是跟普通的常量是一樣的。
變參數
有一種用任意數量的值作爲參數的方法是使用數組。但是使用Varargs(變參數)能夠自動完成並且隱藏了其具體的過程。James Gosling使用…語法。一般的,Varargs一般是最後一個參數。在JDK 5中,MessageFormat.format函數已經使用varargs進行重寫了。
public static String format(String pattern, Object... arguments);
String result = MessageFormat.format("At {1,time} on {1,date}, there was {2} on planet "
+ "{0,number,integer}.", 7, new Date(),
"a disturbance in the Force");
使用Varargs使得反射更加簡單
因此你可以使用c.getMethod(“test”).invoke(c.newInstance())而不是使用c.getMethod(“test”,new Object[0]).invoke(c.newInstance(),new Object[0])).
什麼時候將使用變參數啊?
1. 如果設計自己的API的時候,請保守地使用
2. 當benefit是強制的時候,不要重載varargs方法
3. 在客戶端中,當API支持:反射,消息格式化,printf
靜態引入
客戶端常要限定類裏面的靜態成員(Math.PI)。爲了避免這個,一些程序員將一些常量放到接口中,並且實現了它。BAD(常數接口反模式)。在JDK---java.util.jar中也是錯誤地用了這種模式。靜態地引入能夠毫無限制地訪問靜態成員。所有靜態的屬性,方法等等將在使用靜態引入之後都能夠獲得。
import static java.lang.Math.*;
r = cos(PI * theta);
什麼時候將使用靜態引入?
最好少用----過度地使用會使得程序很難讀。當有可能濫用繼承的時候使用它
元數據
使用額外的信息來裝飾程序。註釋不會影響程序的語義。但是在使用工具或者庫的時候能夠影響使用者態度。能夠從下面來讀出來,源代碼,類文件等等。像@deprecated,transient等等。jdk 5.0提供了更加通用的元數據工具。
爲什麼使用元數據呢?
很多的API需要一些樣本文件,像JAX-RPC等等
l 像很多的API需要維護的”side files”,像BeanInfo類,部署描述符
l 很多API使用有名的模式,像JUnit
元數據鼓勵使用聲明式編程樣式---告訴計算機將做什麼,現在還有怎麼去做。註釋類型聲明跟接口聲明一樣。特殊的註釋類型包括標記註釋和單元素註釋。
在新發布的JDK1.5/J2SE 5帶了一組新的試驗工具。
性能監測工具jconsole ,jps,jstat,jstatd。同時一些新的故障發現和修改工具也可以下載了。這些工具能夠顯示內存表,在線程中生成堆棧跟蹤,以及給一個進程或者核心打印配置信息。
監測,管理工具
- jconsole:J2SE監測和管理控制檯---一個同JMX兼容的監測Java虛擬機的圖形工具。其能夠監視當地或者遠程的Java虛擬機。
- jps:java虛擬機進程狀態工具---在目標系統上列出裝備有HotSpot Java的虛擬機
- jstat:java虛擬機統計監視工具---附加到一個裝備了HotSpot的java虛擬機上來採集並且記錄性能統計情況
- jstatd:java虛擬機的jstat守護程序---啓動一個RMI服務器程序來監視各個HotSpot java虛擬機的創建和中止。並且提供了一個訪問遠程監視工具接入的接口。
故障工具
l jinfo:java的配置信息。打印出一個給定的進程或者核心文件或者遠程debug服務器的配置信息。
l jsadebugd:Java實用Agent調試守護進程----連接一個進程或者一個核心文件,使得其運行像一個調試服務器。
l jmap:Java內存映射----打印共享對象內存映射或者一個給定的進程或者核心對象或者遠程調試服務器上堆內存的細節
l jstack:Java堆棧跟蹤---打印出給定的進程或者核心文件或者遠程調試服務器的線程的堆棧跟蹤信息
另外在JDK裏面,還帶有很多常用的標準的工具:
如基本工具(javac,java,javadoc,apt,appletviewer,jar,jdb,javah,javap,extcheck)
安全工具(keytool,jarsigner,policytool,kinit,klist,ktab)
國際化工具(native2ascii)
遠程方法調用(RMI)工具(rmic,rmiregistry,rmid,serialver)
Java IDL和RMI-IIOP工具(tnameserv,idlj,orbd,servertool)
Java部署工具(pack200,unpack200)
Java插件工具(htmlconverter)
Java Web Start tools(javaws)