學程式設計語言就是學編程思想,所以要盡量學習與自己熟悉的語言差異大的,以拓展思路。因為Java和C++長得太像,所以一直沒什麼興趣學習它,直到工作要用到。用了一個月,談幾點感受:
1) 冗長
只要有好的IDE,寫代碼不算太累,讀代碼有些費勁。我用的Java入門書是《Java編程思想》,總覺得書中的代碼太長,提取有用的資訊很累,所以主要看文字,很少看代碼。這一半是因為Java本身的冗長,一半是因為不少編程書的通病——廢代碼太多。
2) 安全
異常機制讓程式員更願意處理異常,很適合輸入不很明確的場合。
型別安全讓程式員更專心於程式本身,而不用學習一些額外的東西來確保型別安全——比如在C,C++中,以下的代碼埋著bug:
if (cppIsBest == true) { javaIsBest = false;}
因為在C語言中,cppIsBest也可以是int類型(在C++中更無法確定是什麼詭異類型);而在Java中,以上的代碼則沒有問題,只是觀感上易引起C程式員的疙瘩……
然後是記憶體安全,Java所有的對象都是在堆上建立,當然就配有GC,可以放心地new——起初這一點還是很爽到我的,現在習慣了……
順便吐嘈一下現在很火的Objective-C。蘋果一直不願在iOS上讓Objc支援GC(其實iPhone做得再厚一點就可以支援GC的),讓程式員手動管理引用技術。現在幹出個ARC,讓clang自動管理引用計數——這正好說明之前手動管理方式的繁瑣、無意義。
3) 沒有局部靜態變數
不明白Java的設計者出於什麼樣的考慮不支援這一特性,這樣的惡果就是,本該出現在函數裡的靜態變數,都跑到類裡去了,造成不必要的命名汙染,嚴重降低代碼可讀性。
4)缺少Lambda運算式
相比其他主流語言,Java的抽象能力不夠,沒有build-in的lambda。只能通過內部類實現閉包結構——這不夠直觀,而且有另一個問題……
5)泛型?
剛寫Java代碼時嘗試過通過閉包和泛型實現Lambda,以期更好的抽象,減少重複。結果發現編譯不過,然後發現模板參數只會被認為Object類型……為此我又寫了個interface,打消泛型的想法。這樣寫出的代碼不夠直觀,且有命名汙染。
最後,學習Java並不能帶來多少新的編程思想……