我為什麼使用 Java
根據你的工作需要,可能有比 Java 更好的語言,但是我還沒有看到任何能把我拉走的語言。
我記得我是從 1997 年開始使用 Java 的,就在 Java 1.1 剛剛釋出不久之後。從那時起,總的來說,我非常喜歡用 Java 程式設計;雖然我得承認,這些日子我經常像在 Java 中編寫“嚴肅的程式碼”一樣編寫 Groovy 指令碼。
來自 FORTRAN、PL/1、Pascal 以及最後的 C 語言 背景,我發現了許多讓我喜歡 Java 的東西。Java 是我物件導向程式設計的第一次重要實踐經驗。到那時,我已經程式設計了大約 20 年,而且可以說我對什麼重要、什麼不重要有了一些看法。
除錯是一個關鍵的語言特性
我真的很討厭浪費時間追蹤由我的程式碼不小心迭代到陣列末尾而導致的模糊錯誤,特別是在 IBM 大型機上的 FORTRAN 程式設計時代。另一個不時出現的隱晦問題是呼叫一個子程式時,該子程式帶有一個四位元組整數引數,而預期有兩個位元組;在小端架構上,這通常是一個良性的錯誤,但在大端機器上,前兩個位元組的值通常並不總是為零。
在那種批處理環境中進行除錯也非常不便,通過核心轉儲或插入列印語句進行除錯,這些語句本身會移動錯誤的位置甚至使它們消失。
所以我使用 Pascal 的早期體驗,先是在 MTS 上,然後是在 IBM OS/VS1 上使用相同的 MTS 編譯器,讓我的生活變得更加輕鬆。Pascal 的強型別和靜態型別是取得這種勝利的重要組成部分,我使用的每個 Pascal 編譯器都會在陣列的邊界和範圍上插入執行時檢查,因此錯誤可以在發生時檢測到。當我們在 20 世紀 80 年代早期將大部分工作轉移到 Unix 系統時,移植 Pascal 程式碼是一項簡單的任務。
適量的語法
但是對於我所喜歡的 Pascal 來說,我的程式碼很冗長,而且語法似乎要比程式碼還要多;例如,使用:
if ... then begin ... end else ... end
而不是 C 或類似語言中的:
if (...) { ... } else { ... }
另外,有些事情在 Pascal 中很難完成,在 C 中更容易。但是,當我開始越來越多地使用 C 時,我發現自己遇到了我曾經在 FORTRAN 中遇到的同樣型別的錯誤,例如,超出陣列邊界。在原始的錯誤點未檢測到陣列結束,而僅在程式執行後期才會檢測到它們的不利影響。幸運的是,我不再生活在那種批處理環境中,並且手頭有很好的除錯工具。不過,C 對於我來說有點太靈活了。
當我遇到 awk 時,我發現它與 C 相比又是另外一種樣子。那時,我的很多工作都涉及轉換欄位資料並建立報告。我發現用 awk
加上其他 Unix 命令列工具,如 sort
、sed
、cut
、join
、paste
、comm
等等,可以做到事情令人吃驚。從本質上講,這些工具給了我一個像是基於文字檔案的關聯式資料庫管理器,這種文字檔案具有列式結構,是我們很多欄位資料的儲存方式。或者,即便不是這種格式,大部分時候也可以從關聯式資料庫或某種二進位制格式匯出到列式結構中。
awk
支援的字串處理、正規表示式和關聯陣列,以及 awk
的基本特性(它實際上是一個資料轉換管道),非常符合我的需求。當面對二進位制資料檔案、複雜的資料結構和關鍵效能需求時,我仍然會轉回到 C;但隨著我越來越多地使用 awk
,我發現 C 的非常基礎的字串支援越來越令人沮喪。隨著時間的推移,更多的時候我只會在必須時才使用 C,並且在其餘的時候裡大量使用 awk
。
Java 的抽象層級合適
然後是 Java。它看起來相當不錯 —— 相對簡潔的語法,讓人聯想到 C,或者這種相似性至少要比 Pascal 或其他任何早期的語言更為明顯。它是強型別的,因此很多程式設計錯誤會在編譯時被捕獲。它似乎並不需要過多的物件導向的知識就能起步,這是一件好事,因為我當時對 OOP 設計模式毫不熟悉。但即使在剛剛開始,我也喜歡它的簡化繼承模型背後的思想。(Java 允許使用提供的介面進行單繼承,以在某種程度上豐富範例。)
它似乎帶有豐富的功能庫(即“自備電池”的概念),在適當的水平上直接滿足了我的需求。最後,我發現自己很快就會想到將資料和行為在物件中組合在一起的想法。這似乎是明確控制資料之間互動的好方法 —— 比大量的引數列表或對全域性變數的不受控制的訪問要好得多。
從那以後,Java 在我的程式設計工具箱中成為了 Helvetic 軍刀。我仍然偶爾會在 awk
中編寫程式,或者使用 Linux 命令列實用程式(如 cut
、sort
或 sed
),因為它們顯然是解決手頭問題的直接方法。我懷疑過去 20 年我可能沒寫過 50 行的 C 語言程式碼;Java 完全滿足了我的需求。
此外,Java 一直在不斷改進。首先,它變得更加高效。並且它新增了一些非常有用的功能,例如可以用 try 來測試資源,它可以很好地清理在檔案 I/O 期間冗長而有點混亂的錯誤處理程式碼;或 lambda,它提供了宣告函式並將其作為引數傳遞的能力,而舊方法需要建立類或介面來“託管”這些函式;或流,它在函式中封裝了迭代行為,可以建立以鏈式函式呼叫形式實現的高效資料轉換管道。
Java 越來越好
許多語言設計者研究了從根本上改善 Java 體驗的方法。對我來說,其中大部分沒有引起我的太多興趣;再次,這更多地反映了我的典型工作流程,並且(更多地)減少了這些語言帶來的功能。但其中一個演化步驟已經成為我的程式設計工具中不可或缺的一部分:Groovy。當我遇到一個小問題,需要一個簡單的解決方案時,Groovy 已經成為了我的首選。而且,它與 Java 高度相容。對我來說,Groovy 填補了 Python 為許多其他人所提供的相同用處 —— 它緊湊、DRY(不要重複自己)和具有表達性(列表和詞典有完整的語言支援)。我還使用了 Grails,它使用 Groovy 為非常高效能和有用的 Java Web 應用程式提供簡化的 Web 框架。
Java 仍然開源嗎?
最近,對 OpenJDK 越來越多的支援進一步提高了我對 Java 的舒適度。許多公司以各種方式支援 OpenJDK,包括 AdoptOpenJDK、Amazon 和 Red Hat。在我的一個更大、更長期的專案中,我們使用 AdoptOpenJDK 來在幾個桌面平臺上生成自定義的執行時環境。
有沒有比 Java 更好的語言?我確信有,這取決於你的工作需要。但我一直對 Java 非常滿意,我還沒有遇到任何可能會讓我失望的東西。
via: https://opensource.com/article/19/9/why-i-use-java
作者:Chris Hermansen 選題:lujun9972 譯者:wxy 校對:wxy
訂閱“Linux 中國”官方小程式來檢視
相關文章
- 我為什麼要使用Webpack?Web
- 我們為什麼要學Java?Java好在哪?Java
- GC是什麼?為什麼我們要去使用它GC
- 超硬核的Java工程師分享,什麼是Java?為什麼我要做Java,我是如何學習Java的?Java工程師
- 我為什麼使用Linux做開發Linux
- 為什麼我們不使用GraphQL? - Wundergraph
- 為什麼我們做分散式使用Redis?分散式Redis
- 為什麼我反對過度使用TypeScript?TypeScript
- 在 Go 語言中,我為什麼使用介面Go
- 為什麼我在2019年仍在使用jQuery?jQuery
- 我為什麼要使用谷歌瀏覽器谷歌瀏覽器
- 我們為什麼要使用CRM系統?
- 我為什麼要做IT
- 為什麼我會選擇走 Java 這條路?Java
- 為什麼我覺得 Java 的 IO 很複雜?Java
- 因果迷境:為什麼我們會問“為什麼”?
- 為什麼我從Java切換到Rust? Opensource.comJavaRust
- 2019 為什麼我們還會繼續使用 PHP ?PHP
- 為什麼我推薦你使用 systemd timer 替代 cronjob?
- 為什麼我使用了索引,查詢還是慢?索引
- 為什麼說Java中要慎重使用繼承Java繼承
- 為什麼 java 容器推薦使用 ExitOnOutOfMemoryError 而非 HeapDumpOnOutOfMemoryError ?JavaError
- 為什麼我們需要 VuexVue
- 我們為什麼要用RedisRedis
- 我們為什麼而工作
- 我們為什麼需要CDP?
- 我剛開始學習java,我什麼也不懂,框架到底是什麼,沒有框架可以使用java嗎Java框架
- Java程式設計師修煉之路(一)我們為什麼選擇JavaJava程式設計師
- 為什麼我們要使用無伺服器架構伺服器架構
- 2020年,為什麼我們應該使用abapGit代替SAPLinkGit
- 為什麼我停止使用IPFS和分散式Web? - withblue分散式Web
- 什麼是Web workers?為什麼我們需要他Web
- 為什麼使用PythonPython
- 什麼是Docker?為什麼使用docker?Docker
- 我們為什麼需要async/await ?AI
- 為什麼我要用GoEasy替代WebSocketGoWeb
- 我為什麼從php轉go?PHPGo
- 我為什麼冒險寫QuarkAdmin!