描述AWT和Swing的歷史
Overview概述
Java GUI 工具包一直是一個倍受爭議的話題。同樣的爭論也發(fā)生在其他編程語言如Smalltalk。實際上每個平臺無關(guān)的語言都存在著這樣的爭論。Java作為當前最受廣泛使用的編程語言而尤為突出。
這場爭論在支持模擬組件(如widgets和control,在下文中也稱之為仿造組件)和支持本地組件(在下文中也稱之為原生組件)的人們之間展開,于是Java開發(fā)者形成了兩個不同的陣營,提倡使用模擬組件的Swing,和提倡使用原生組件的SWT。
歷史
Internet上有許多圍繞這一爭論的故事。你可能已經(jīng)聽說過它們中的大多數(shù)了,其中之一有助于讓你理清頭緒,讓我們就從這里開始,Amy Fowler是Swing陣營的一個倡導者。
回到上個世紀90年代,曾幾何時有3家龐大的Smalltalk公司——IBM、Parc-Place和 Digitalk。在90年代初期3家公司的市場份額大致相等,生活是美好的。Parc-Place采用仿窗口部件(emulated widgets)的設(shè)計(即Swing的設(shè)計),IBM和Digitalk則采用原生窗口部件(native widgets)。后來IBM壓倒了另外兩家,因此他們打算合并成一家,假設(shè)叫做Parc-Place Digitalk。隨后當他們試圖將他們的產(chǎn)品融合到一個叫做Jigsaw的計劃中時爆發(fā)了一場大戰(zhàn),計劃由于政治原因失敗了(開發(fā)人員實際上已經(jīng)能讓它運轉(zhuǎn)起來),就因為原生和仿造兩派的死戰(zhàn)。
Amy贏得了精神上的勝利,不過IBM贏得了他們所有的生意,因為這兩家公司在一整年里除了吵架什么都沒做。當塵埃落定之后PPD(Parc-Place Digitalk當時已改名為Objectshare,跟Windscale改名為Sellafield的原因相同——讓人們淡忘之前發(fā)生的災難)的股票價格從60美元掉到了低于1美元1股。他們因為偽報收入被NASDAQ摘牌,從此消失。
當時,AWT和Swing已經(jīng)出現(xiàn)了。SUN當時已經(jīng)建立了一套基本的可移植控件類,這些類映射到不同操作系統(tǒng)上的原生窗口組件(native widget),當時的AWT還滿是漏洞,遠不能稱為可靠,還需要SUN的coder們?nèi)バ扪a。然后Amy被雇傭了,她承諾通過輕量級方案解決所有窗口組件的問題,以此說服SUN管理層讓她當了GUI開發(fā)部門的頭頭。隨后Amy雇傭了所有她過去在Parc-Place的舊朋友,讓他們來開發(fā)Swing。
在IBM,VisualAge for Java最初是用Smalltalk(用的是原生窗口組件)寫的,當將這些工具向Java代碼庫遷移時,他們需要一套窗口組件。IBM這邊的開發(fā)人員都是原來搞Smalltalk的那一批人,他們對管理層要求用Swing來構(gòu)建WebSphere Studio工具都非常不情愿?!癝wing是個可怕的充滿缺陷的怪獸“。因此開始了一個新的項目,把他們的Smalltalk原生窗口組件移植到 Java上去。這個工具集后來被成為SWT,S開始是Simple的縮寫,不過后來變成了Standard的縮寫。這個項目獲得了成功,被運用在發(fā)布的 VisualAge Micro Edition產(chǎn)品中。他們當時發(fā)現(xiàn)在Swing讀事件隊列的時候用了一種可能留下內(nèi)存漏洞的方式,而不得不采用他們自己的查詢 Windows事件隊列的循環(huán),以糾正這個錯誤。這促成了他們關(guān)于SWT,AWT和Swing不能共存的決定。他們把這個工具包放到了Eclipse中,這是一個來自于早期Visual Age的工具平臺。
你應該已經(jīng)從上述的故事中對三者的歷史有了大概的了解,尤其是SWT?,F(xiàn)在你也許會覺得,IBM創(chuàng)建SWT的理由是合理的而Swing應該沿用SWT采用的方式。這樣的觀點是片面的,當你深入了解到Java的本質(zhì)之后,你會發(fā)現(xiàn)其實并不像你想象的那么簡單。
先決條件
什么才是Java本質(zhì)的,影響到工具集設(shè)計的特征呢?或者說,什么才是Java GUI工具集設(shè)計的先決條件呢?
答案來自于Sun對Java的承諾之一:write once, run anywhere(一次編寫,隨處運行)。這是Java不同于其他語言的優(yōu)勢所在。在Java被創(chuàng)建之前,軟件的跨平臺性能是開發(fā)者,特別是那些希望對多平臺提供支持的開發(fā)者的夢魘。在當今的生活中Internet的使用已經(jīng)相當?shù)钠毡榱?,在世界不同角落的人們在不同的平臺上工作著。軟件提供商為不同的操作系統(tǒng)提供支持是再平凡不過的事情。Java的write-once-run-anywhere(WORA)承諾顯然減輕了開發(fā)者的負擔,極大地提高了軟件開發(fā)的生產(chǎn)力。
然而編寫跨平臺的應用程序,你必須使用支持平臺無關(guān)性的標準庫。這些標準庫包括語言支持,公共用途,網(wǎng)絡(luò),I/O和GUI工具集等。所以當Sun開始設(shè)計 GUI工具集的時候,首要任務就是考慮一個設(shè)計良好的平臺無關(guān)的API。AWT和Swing都被小心地設(shè)計以保證平臺兼容性。SWT則相反,它在設(shè)計之初并不以擴展性為原則,它為一個專有的IDE Visual Age for Java而設(shè)計,Windows作為這個IDE的首選運行環(huán)境擁有很高的優(yōu)先級考量。SWT API類似于WIndows,通常它并不如Swing的擴展性好,盡管Steve Northover,SWT之父,辯稱SWT是平臺無關(guān)的,你可以很容易地發(fā)現(xiàn)許多Windows API的痕跡。
【編輯推薦】