Java最困擾你的那些事

importnew發表於2013-12-26

  啊哈Reddit(某知名國外線上問答社群),沒了你我們還能在哪裡從魚目混珠的網路中提煉真正的精華?就在這雜亂無章的論壇中,的的確確存在著這樣一些精闢的討論。

  比如有個叫Shambloroni的兄弟發起了一個引起廣泛共鳴的話題(收到了150個回覆和投票)。話題的開始是他在吐槽 Java 有哪些方面最讓他感到厭煩,同時他又向其他程式猿徵集關於編寫Java時令人蛋疼(傷感……)的故事。

  下面我列出了一些最有意思的回覆——你會同意嗎?

  Try-catch 宣告之殤

雖然我才剛剛開始編寫 Java 程式,但是在Java 中實現讓程式停頓一些時間然後繼續執行這件事情已經複雜的令我震驚。除了寫下基本的指令完成停頓外,我還必須要用 try-catch 來包裹的這些操作。沒準對於大牛來說這不算什麼,但是對我來講這太令人難過了。

還有跟所有 IO相關的異常也讓許多簡單的事情變得繁瑣起來。比如我僅僅想簡潔地做些事情,但最後總是會搞砸,。然後我不得不在所有方法上加上“throws Exception”。

  沒有,沒有,還是沒有

  • 沒有無符號的整形。
  • 沒有操作符過載。
  • 沒有物件屬性。
  • 沒有代理 (儘管我聽說 Java 8 中可能引入了代理或類似機制,但我還沒細看)。

我同樣痛恨很多 Java 庫中引入模組的方式(比如根據名稱載入模組)。相對而言,我更希望在編譯時就能檢查我需要的依賴庫是否已經載入了。

  找不到愛…

我恨 Java,就是單純的恨。負責任地說,我從不使用 Java 寫程式的最大因素就是因為我恨它。還有一點就是JRE糟糕的模組化。就算你用了一些載入工具比如Launch4j,你仍然需要讓使用者安裝一個超過200 MB 的框架來執行程式。

  沒有getter、setter

 Java還缺少getter和setter註解。這樣可以更簡單的新增和移除模板程式碼。

  缺乏亮點

Java 缺少一些殺手級的模組。雖然聽說一些不錯的模組將被加入到Java 9.x 中,但目前為止這是我最大的槽點了。

  非暴力不合作

我遇到的最大的麻煩就是如何一起使用基本元素和物件。例如, 把一個char[] 型別的變數轉換成一個列表別提有多費勁了,而且我感覺這種操作根本沒必要這麼麻煩。

  心願單

  • 我最想要的就是像 Perl 中那種上下文相關的函式了,以及當處理真正的異常時,這些函式可以在一個語言中所扮演的角色。
  • 我還希望 Java 可以支援智慧打包返回值,這樣我們就可以像在Perl中那樣返回一個包含多個值的列表了。
  • 我希望使用異常的標準庫還可以在不適合丟擲異常的場景下使用並能夠處理失敗。
  • 還有,另一個煩人的地方就是我在用 StringWriter 時候還要處理 IO 異常。

  還缺些什麼

  • 缺少巨集對我來說使 Java 減分不少(我並不說在 C/C++ 中使用的前處理器巨集,而是在Lisp/Scheme 中使用的那種巨集)。
  • 不論做什麼事情你都需要定義一個類,儘管你可能肯本不需要一個類。比方說,我想把一段經常使用的程式碼提取出來,然後在需要地方使用——為了達到這個目的,我必須要把這段程式碼封裝成一個final static的方法,並放在一個類中。這樣一來我還得費勁去給類取一個方便理解的名字……本來這事兒可以很簡單(這確實很簡單, 尤其是當你可以定義巨集的時候)。

  有沒有搞錯

  • 缺乏對泛型的支援。C++ 中的模板要強大的多。
  • 事實上,在Java 中你根本不能在泛型中例項化一個類,除非你把這個類作為引數來宣告一個泛型。
  • 你很難給一個類加上結構函式並讓它銷燬這個類。RAII(一種資源管理模式,見 C++)卻一直非常有用。
  •  沒有操作符過載。C++ 允許你是將 == 操作符用於比較字串。同樣的,大整數運算因為同樣的原因變的很難使用。

  呃, 好吧

沒有無符號的基礎型別。這尼瑪是鬧哪樣啊!

  還是getter、setter

1、null(最大槽點)。

2、沒有getter和setter註解(例如,沒有屬性)。

3、Java 只支援位置引數。我喜歡像Smalltalk 那種支援多樣化的引數形式,或者是強制使用關鍵字引數的Python 3。

比如在 Samlltalk 中呼叫一個具有兩個引數的函式,可以這樣做:

myInstance myMethodWithFoo: arg1 Bar: arg2

在 Python中你可以使用下面的語法來呼叫函式並給函式引數賦值:

my_inst.my_method(foo=arg1, bar=arg2)

4、……不支援多分派(Multiple Dispatch)?

這些是我最先想到的,不過覺得應該還有更多。認真地說,使用回撥函式一直是一個大問題,因為它太麻煩了。不過Java 8 中解決了這個問題,我還是很開心的 =)

  愚蠢的預設值

  • 預設的可見性。如果沒有給變數或方法一個修飾符,那麼這個方法應該是私有的,而不是包內可見。
  • 預設的修改能力。最終型別(在所有情況下)應該是預設的,並用“var”作為修飾符。目前的情況是,程式設計師很少會把一個方法的引數設定為最終型別,因為那樣會讓變數很快變得不可讀。同時,在一個方法中重寫引數也是很少見的情況。
  • 集合介面。Java 中應該提供一個可寫的集合介面,現在集合繼承自這個可寫的介面,只是把所有改變集合內容的方法遮蔽掉。這樣就會減少現在你會在Collections.unmodifiable……() 和一些第三方的API中見到的那些令人困惑的歷史遺留方法。有了可寫的集合介面,Java 將會變得更加型別安全。
  • 缺少表達能力。在用過Scala (或是最新的PL)之後, 你會覺得Java 非常的繁瑣。這是最常見的關於Java 的吐槽,但它這就是事實。

  說說異常

被強迫的處理異常——真主保佑你。誰能告訴我為什麼我非要用try-catch 來包裹每一個Thread.sleep() ……?我從來就沒有真正見過那個我被要求去處理的InterruptedException。

我知道我要說的可能不是一個廣泛認可的問題,但是我真的同意checked exception(應被檢查的異常)很煩人。這些異常讓程式碼變得面目全非還讓重構變得不可能。我明白他們為什麼存在(而且理論上也說的通),但是他們沒為開發者帶來什麼實質好處。不論你做什麼,都不要留一個空的catch 塊,就算你認為這個異常永遠不會發生。你大可以把這個checked exception用RuntionException(執行時異常)重新封裝一下,再丟擲去。

  原文連結: jaxenter 翻譯: ImportNew.com - 靳禹

相關文章