Java7 的新特性就是在switch 代碼塊中加入對String 的支持,雖然還僅僅是加入String,但已經相對之前的版本僅僅支持Integer 要好很多,這個功能在C# 1.0 中就被支持,而且不光是String,所有的對象均可用在switch 塊中(更正:C# 2.0 switch 只可以使用bool,char,integer,enum,string和相應的可空值類型中,A switch expression or case label must be a bool, char, string, integral, enum, or corresponding nullable type)。
The try-with-resource Statement
Java7 的這一個新特性對C# 2.0 程序員來說再熟悉不過了,在編碼一些需要及時釋放的資源時,通常的做法是在finally 塊中調用close() 一類的方法去釋放,而C# 提供了一個簡單的方法實現同樣的功能,代碼如下:
以下是代碼片段:
using(SqlConnection conn = new SqlConnection(“ConnectionStringHere”)){
// Do something
}
上面的代碼等效於:
以下是代碼片段:
SqlConnection conn = new SqlConnection(“ConnectionStringHere”);
try{
conn.open();
// Do somethind
} finally{
conn.close();
}
而Java7 實現了類似的功能,只不過不是用using,而是使用try,代碼如下:
以下是代碼片段:
try (BufferedReader br = new BufferedReader(new FileReader(path))){
return br.readLine();
}
對於C#,使用using 須滿足一個條件,即using 內聲明的對象實現了接口System.IDisposable,這樣一來,finally 塊中的代碼就可自動調用該接口下的Dispose()
方法,從而實現釋放資源的目的。對於Java7 也有同樣的要求,就是對象必須實現接口java.lang.AutoCloseable 或者java.io.Closeable。
The For-Each Loop
Java7 終於實現for-each 循環功能了,雖然是在Java5 中的一個語法增強,但由於Java6 沒有語法更新,故我將這個增強列為Java7 的新特性。不過不理解為什麼還是使用for 作為關鍵字,而不直接像C# 那樣引入foreach 這個關鍵字,這樣是不是更容易理解呢。下面是Java 版本的for-each 代碼:
以下是代碼片段:
void cancelAll(Collection c){
for (TimerTask t : c)
t.cancel();
}
對於C# 版本,代碼如下:
以下是代碼片段:
void CancelAll(Collection c){
foreach (TimerTask t in c)
t.Cancel();
}
可以看出,兩者的實現並無太大區別,同樣簡潔明了,但適用范圍卻不一而足,Java7 貌似只能實現在集合中(包括傳統數組和泛型集合),而C# 可用在任何實現了System.IEnumerable 或其泛型版本System.IEnumerable 的對象中。