Java 最困擾你的那些事

啊哈Reddit,沒了你咱們還能在哪裏從魚目混珠的網絡中提煉真正的精華?就在這雜亂無章的論壇中,的的確確存在着這樣一些精闢的討論。html

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

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

Try-catch 聲明之殤

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

還有跟全部 IO相關的異常也讓許多簡單的事情變得繁瑣起來。好比我僅僅想簡潔地作些事情,但最後老是會搞砸,。而後我不得不在全部方法上加上「throws Exception」。安全

沒有,沒有,仍是沒有

  • 沒有無符號的整形。
  • 沒有操做符重載。
  • 沒有對象屬性。
  • 沒有代理

我一樣痛恨不少 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 - 靳禹

相關文章
相關標籤/搜索