把握現在,掌控未來:2008 Java開發展望

elevenxl發表於2008-04-05

2007 充滿了激盪人心的事件,動態語言的不斷升溫,JVM在開源社群不斷髮展以及Java社群的重要貢獻者,Google的崛起等。問題是,這些預示了來年什麼 呢?安德魯•格勒弗(Andrew Glover)準備了一些答案給那些打破砂鍋問到底的Java開發者――現在,什麼在2008接踵而至。

法國詩人保爾•瓦雷裡曾經傷心地寫下“困擾我們這個時代的是,未來,並不像過去看上去的那樣”。然而,對於我們這些生活在Java平臺崛起推動的網際網路時代的人來說,瓦雷裡多年前留下的這些詩句是永恆的。

過去的十多年,我們見證了Java Applet的興起和沒落,見證了EJB頭頂上光環的不斷暗淡,見證了JSF,Spring和Struts的異軍突起(暫且不談Struts漸漸顯露的頹 勢),見證了Java已經重新定義成為一種語言和一個平臺。Java平臺已經衍生出三個分支(標準版本,企業版本,微型版本),JDK也開放給了開源社 區。Java語言擴充了,包含了註解,範型,列舉型別,高階集合型別,還有更多。它也開始與動態語言,如Groovy,JRuby和Rhino等,共享 Java執行時(JRE)。事實上,如果稍稍留神一下,我們在過去的幾年裡注視著Java不斷地從一種語言演變成為一個真正的平臺。

在最近的十年裡,我們知道Java已經不僅僅侷限於一種語言或者一個平臺了:它是一個社群,一個經濟生態系統,一個鮮活的實體,而且這個實體已經發展成熟,成為了豐富的應用程式,或大或小公司的真正的生命線。

因此,儘管流言不少,我還是堅持認為Java在2008會持續紅火。與其拿起卦子掐算未來,我們不如回顧一下過去的一年的趨勢以及發生的重大事件。這些事件彙集起來,它們會告訴我們2008將發生什麼。

遍地開花

2007 年猶如雲霄飛車一樣,非常引人注目。人們對動態語言的不斷關注, JVM在開源社群不斷髮展以及Java社群的重要貢獻者,Google的崛起。更多的是,單元測試,持續化整合和其他敏捷開發技術得到了更廣泛的接受,這 些都表明Java開發者開始認識到我們的技藝是一門有責任要求的行業。我們終於開始重視程式碼的質量和壽命,將其與推向市場的速度,或者是在企業的即時應用 放到同等重要的地位上來。

每個人都說,2007年有一些絕對的勝利,但是同時也有一些失望和爭論,這給Java社群產生了超出預期更多的阻礙。留心一下以下這些體現過去一年的重大因素。

動態語言的成熟

隨著1.0以及隨後的1.5版本的釋出,Groovy在2007的發展達到了一個關鍵的里程碑。走過過去5年或者多年的歷程,Groovy沒有替代Java,相反定位成了Java執行時(JRE)的補充語言。

Groovy的大賣點是簡練的語法,簡化了日常的開發工作。例如,開啟和讀取一個檔案在Java語言是典型的冗長結構:

try {
BufferedReader in = new BufferedReader(
new FileReader(path));
String line;
while((line = in.readLine()) != null){
System.out.println(line);
}
in.close();
}catch(IOException e){
System.err.println("Exception reading");
}

但是同樣的程式碼,Groovy可以寫的更加敏捷:

new File(path).eachLine{ line ->
println line
}

根本上,Groovy像其他動態語言一樣,可以讓你扔掉異常處理,型別和分號,還可以使得程式碼更加簡練,而程式碼簡練最終使得程式碼的可讀性更強(是的,上面那個File物件是一個Java java.io.File物件)。

把網撒開

然而,Groovy並不是2007年動態語言陣營的唯一參與者。2006年釋出的Java 6版本引入了一個與動態語言互動的標準API,很多Java開發者在去年臨近年底才開始體驗。對該API進行旗艦式整合的是Rhino。但是,看起來在 Java7版本釋出時還會有更多整合進來。

最早進行整合的語言之一不容置疑是JRuby,1.0版本的釋出和令人咋舌的比Ruby本身執行速度還快的實現,使得它備受矚目。像Groovy一 樣,由於可以使用更加寬鬆的語法,加入了一些特殊機制的JRuby(它可以使 RubyJVM裡執行,且與正常的Java物件互動)使Java開發更加簡單。例如,使用Ruby可以增強標準的物件,象用Ruby的String操作會 更加容易。在標準的Java裡,檢查一個String例項是否為空值可能要做象如下方法的一樣的操作(這是一個Apache commons-lang的 isBlank實現)。

public static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
return true;
}

在Java 裡,String是一個final類,所以你無法為了讓String型別支援一個象isBlank的方法而擴充套件它。後果是,你不得不依賴第三方類庫,象 common-lang。有了Ruby,你就可以在Ruby的String上另外定義一個blank方法,如:

class String
def blank?
empty? || strip.empty?
end
end

實際上,Ruby式的動態允許執行時新增額外的行為到核心類庫或任意物件(象給String增加一個blank?方法)。更進一步,JRuby可以進行反作用對核心Java物件增加方法。因此,稍一施法就可以給Java String類新增一個blank方法。

開放Java核心

07年Java的開源意味Java平臺的發展不再由Sun核心工程師們說了算了:現在它的前途由我們掌握了。對Java類庫,Javac,甚至JVM本身都採取GPL協議,OpenJDK保證將會開創一個創新的週期。實際上,我們已經看到了。

在2007 年十月,一個名為Multi-Language VM的專案在OpenJDK旗下開展了。這個專案旨在通過修改Java的底層架構,實現“以JVM特性為原型,高效支援Java之外的語言”。很明顯,這 專案結合了07年最令人振奮的兩個發展潮流,也就是圍繞在動態語言的熱衷和OpenJDK,這宣稱我們處在了一個Java核心創新的時代。

Sun 的開放當然不是從OpenJDk開始的,而是Glassfish,作為Sun支援的開源應用伺服器,它在2007自始至終獲得了社群更多的追捧。最近,我 們無法忽略Sun對MySQL AB的收購,MySQL背後的公司是MySQL AB,而MySQL似乎是當今最流行的開源資料庫。

所有這些發展都表明Java的鼻祖採取了一種受開源軟體很大影響的商業模式。這意味我們在2008或者更遠將看到Java平臺更多的開放。當然,這會對Java生態系統的商業方面產生深遠影響。相比最近Oracle以70十億美金收購BEA,這似乎很綠色,很健康。

Google flexes

移動Java領域曾經變的不景氣,但是臨近2007年尾時,卻因Google的Android平臺的釋出而重煥青春。Android的目標是為新一 代移動裝置引入應用軟體,且執行在由Google主導的開源作業系統之上。雖然Android是一個完整的平臺(很像Java),但是構建Android 應用程式的SDK卻是建立在Java之上。

此外,Android的Java與J2ME的Java截然不同。實際上,在JVM層面,Android的JVM就已相當獨特了。除了執行專門為 Android而設計,高度優化的位元組碼格式的程式碼,它不可以執行標準Java位元組碼。移動裝置上執行不同實現的Java意味這我們將可以看到一些有趣的 應用程式――當然,這也僅進一步說明了Java的無處不在。

2007 年Google在Java世界移動領域之外也進展的很順利。但是,備受關注的是Guice的釋出,Guice是一個基於Java 5註解和範型的依賴注入開源框架。雖然IOC市場上的佼佼者還是Spring,因其摒棄XML檔案,提倡使用註解和Guice本身的Module型別,注 定了Guice在公開發布時就是一個先行者。

考慮到Google對第二代IOC框架的影響和Google AdWrods本身的基礎架構都是依賴Guice的,Guice在來年很有可能將得到更多的關注。

敏捷成為主流――測試時代到來了

敏捷(agile)這個名稱對大家來說並不新鮮,單元測試與持續化整合也不陌生。不過,2007年似乎是這些實踐更加成為主流的年份。你不會碰到一 個會議裡沒有一到兩個關注在敏捷上的演示的。再哆嗦幾句,瞥一眼2008年度Jolt Award大獎關於綜合性和技術性書籍(從2007年甄選的)的最終名單,就可以看出關於單元測試和持續化整合的書籍佔有一席之地。然而,更重要的是,不 管是享有盛譽的,還是剛剛發展的框架都已經開始宣稱它們的架構是多麼容易地進行測試了。似乎,開發人員的測試時代終於到來了。

Java成長之痛

Java在不斷的成長,不斷的擴充,然而它在逐漸變化成為一個平臺,而不僅僅是一種語言。不知是好還是壞,獨具特性的東西一直在不斷的新增進來,以後還將會有,社群會接受特性嗎?

然而,一些特性就沒有其他特性那樣受歡迎了。舉個例子來說,註解就很受歡迎――象JUnit4, TestNG, Spring和Google的Guice這些框架,由於對註解的創新的使用,就得到了不少開發人員的青睞。相反的是,到目前為止,人們對範型(在Java 5中引入)並沒有保持對其自始至終的熱情。

閉包(Closure)未見蹤影

如果範型不足以使程式設計的前景變的灰暗,有人可能會發現當前圍繞關於在Java 7 foggy中加入閉包和區域性函式提議的爭論。雖然我絕不會否認它們是有用的組成部分,只是,將它們增加到Java語言的語義中,概念的複雜性增加只會降低它們的有用性。

例如,在一個閉包的典型參考實現中,找到如下程式碼,它定義了一個簡單的支援整數加法的閉包:

{Integer,Integer=>Integer} plus1 = {Integer x, Integer y => x+y};

非常有趣的是,由於Java天生的對語義要求,語句變的拖沓冗餘――用Groovy來重寫同樣功能,卻很容易。例如

plus1 = { x, y -> x+y }

注意到,在Groovy的例子中,型別的缺失無疑使得程式碼的意圖一目瞭然。當然,Ruby版本也會同樣簡明扼要。

顯然,象動態語言普遍受到歡迎此類的外部力量在不斷地影響Java。如果想使用閉包,你完全不必等待Java自帶的閉包――Groovy和JRuby對其的支援就已經很優雅。

真正的併發

Java7 值得期待的其他事情是java.util.concurrent包的釋出,這個包致力於通過充分利用底層硬體來達到真正的併發。雖然Java已經支援多線 程,但是通過對並行性的進一步重視,硬體資源將變的越來越健壯。最終,Java語言也發展的可以應付這些要求。

由JSR 166專家組領導的Java 7將很有可能包含一些新特性,包括名為join-fork的細粒度的平行計算框架。好訊息是,看起來這些新特性是嶄新的類(和API),與生俱來就不符合句法規則。

奔向RIA

07年,特別是Sun在2007年JavaOne上讓JavaFx對公眾面世後,RIA(Rich Internet Application)繼續讓Java Web應用程式開發人員產生莫大的興趣。JavaFX產品家族現在由JavaFX Script和JavaFX Mobile組成。

由於開發類Ajax應用的JavaScript無處不在,對 JavaFx的反應顯得見仁見智。看起來JavaFX將會加劇本來就已經四分五裂的移動環境之間的裂縫。很多人感覺JavaFX的公告有點操之過急,還有 一些人懷疑它究竟是不是一個霧件。不管怎樣,Sun進入RIA領域傳達了一個長期戰略的訊息,這會使Java的前景更加光明。

結束語

有個非洲諺語說“明天屬於那些今天為它準備的人”。因此,Java的未來(至少來年)已經孕育了一段時間了。2008年的大事的很大部分將不僅由 JVM本身促成,而且也會隨著JRuby和Groovy不斷受歡迎,最終得到更多廠商的採納而形成。由於Google Android的出擊和Sun JavaFX Mobile的釋出,使用Java開發使用者移動應用的前景也好像比以前更加容易到達了。大部分人的注意力將被多核系統的出現吸引過去,期待Java 7 java.util.concurrent包對其的回應。最後,圍繞它的開源的Java和商業模型也會不斷的成長。

作者簡介

Andrew Glover是Stelligent Incorporated的總裁,Stelligent Incorporated是一家幫助開發團隊加速軟體開發的諮詢公司。他的blog通常是thediscoblog.com和testearly.com。

 
注:以上內容來自網路,本人不承擔任何連帶責任
文章轉自:http://developer.51cto.com/art/200804/68870_2.htm

相關文章