從去年到現(xiàn)在,從.NET轉(zhuǎn)向Java開發(fā)(只是因為項目原因,絕對與平臺好壞沒有關(guān)系)差不多有一年的時間了。通過這一年時間也有些感觸,想從幾個面比較一下這兩個平臺。希望能做到客觀公正。
語言
我原來是使用C#語言的,和現(xiàn)在的Java語言相比,現(xiàn)在的Java語言語法就停留在C# 2.0這個年代。語法結(jié)構(gòu)都非常傳統(tǒng),中規(guī)中矩。很突出的一點是,因為缺少對閉包的支持,有些用C#很容易做到的,用Java需要寫很多廢話代碼。
前幾天InfoQ上發(fā)表了一篇英國衛(wèi)報逐步采用Scala替換Java的文章里一句話用的很好:看Java的代碼很容易讓你只見樹木,不見森林。因為為了實現(xiàn)某個功能,你需要太多的支撐代碼,而實現(xiàn)功能的關(guān)鍵代碼卻迷失了。
舉個例子:我需要一個排好序的用戶列表,排序的依據(jù)是用戶名字。很簡單的需求對不。自然的代碼肯定是這樣的:
IList<User> users = …
users.OrderBy(user => user.Name);
而如果用Java實現(xiàn)同樣的功能你可能要這樣寫:
List<User> users = …
Collections.sort(users,new Comparator() {
public int compare(User left, User right) {
return left.getName().compareTo(right.getName());
}
});
第一:沒有擴展方法的支持,只有借助靜態(tài)的輔助類
第二:沒有閉包的支持,非要寫個難看的匿名類
其實我們只需要一個OrderBy,一看就明白,但現(xiàn)在多了這么多“無用”的代碼,反而核心的價值(order by)卻顯得不那么重要了。這還是一個很簡單的例子,在實際的項目中你會為此付出更多的代價,你要寫出一堆味同嚼蠟的代碼才能實現(xiàn)你想要的那個功能,而那個功能其實是很顯而易見。
所以在語言層面,Java沒有任何亮點,只覺得羅里羅嗦。
關(guān)于語言層面的比較,寫過很多,而且非常精彩。
不過Java也有那么很少幾個有點意思的小東西:比如靜態(tài)導入(腦袋提醒,這東西很早就在VB里出現(xiàn)了)、以及Java對Annotation的特殊支持讓我們可以做一個更有意思的事情。
概念滿天飛
做Java以來,讓我感觸最深的是在Java世界里概念滿天飛。ORM,IOC,AOP,這幾個在.NET的世界里也有,但沒見過這么濃的,但是如果你做Java應(yīng)用,你不熟悉這幾個你都不好意思出去跟人打招呼,所以除了學習Java本身外還有一大堆開源框架等著你研究。
還有什么View Model,Presentation Model,Validator,BRO(Business Rule Object),BPO(Business Process Object),BDD。關(guān)鍵是不僅是概念上存在這樣的名詞,它還大量的出現(xiàn)在代碼里。代碼里將概念描述得淋漓盡致,還規(guī)規(guī)矩矩?;蛟S我土老帽了,我開發(fā).NET三年有余,從來沒整這些玩意兒。但是我一點也不懷疑我的代碼難以閱讀,難以維護。
配置文件,你能再多一點么
我超級厭惡Spring的配置文件(雖然你說這只是個框架,但貌似Java社區(qū)有這個趨向)。雖然Spring現(xiàn)在也增加了注解(Annotation)的支持,但是還有那么一些知道的和不知道的原因,項目中存在大量的配置文件。而且為了“模塊性”,一個小小的配置文件又包含有幾個配置文件。有配置controller的,有配置DAO的,有配置service的。額,還有那該死的Hibernate的hbm文件。我想,系統(tǒng)的復雜性就是這么一點一點的堆積而來的。
ASP.NET的配置文件一度也有變得更臃腫的趨勢,但最后還是大大瘦身(.NET 4.0里默認的web.config很小了)。而且Attribute在.NET的第一個版本就出現(xiàn)了,很多可配置的東西都提供了Attribute的API和XML的API,所以沒有歷史遺留包袱。