作者 | Nishant Aanjaney Jalan
策劃 | 云昭
51CTO讀者成長計劃社群招募,咨詢小助手(微信號:CTOjishuzhan)
Java已經(jīng)存在了將近30年。從1997年開始,有30億臺設(shè)備運行Java。現(xiàn)在Kotlin、Scala等更新的JVM語言流行了,Java是不是已經(jīng)過時了?人們開始厭棄Java了嗎?
我相信有很多人喜歡Java。很自豪本人也其中的一員。當(dāng)像Kotlin和Scala這樣的語言出現(xiàn)時,我發(fā)現(xiàn)這些語言更好。當(dāng)然,這絕不意味我討厭Java。
一、Java過去到底有多受歡迎?
Java的受歡迎程度如此之高,以至于ECMAScript被昵稱為JavaScript,因為它在我們心中取代Web Assembly的速度和Java一樣快。
可以列舉幾個例子來說明Java是一種受歡迎的語言。
二、Java為什么受歡迎?
1.平臺無關(guān)
因為Java運行在Java虛擬機(JVM),相同的代碼可以毫無困難地在多個平臺上運行。另一方面,c有多個編譯器為不同的isa編寫匯編代碼。如果一個C程序可以在機器A上運行,它不能保證在機器b上運行。
類似于C和C++的語法Java與C和C++共享一個相似的語法,這使得程序員不用重新學(xué)習(xí)所有的東西就可以切換到Java。
2.沒有更多的指針
Java消除了指針的外部處理。這意味著你不再有那些煩人的缺點了。Java使用了指針(當(dāng)然),但是代碼是以各種方式抽象的。
3.自動垃圾收集器
在C和C++中,當(dāng)對象不再被使用時,程序員必須手動釋放內(nèi)存(這需要大量的內(nèi)存泄漏)。在Java中,基于程序員應(yīng)該知道的某些規(guī)則,垃圾收集器會自動為您釋放未使用的分配內(nèi)存。
4.面向?qū)ο蟮木幊?/h4>
Haskell是一種純粹的函數(shù)式語言。它嚴(yán)重依賴于數(shù)學(xué)技能,需要練習(xí)才能掌握。Java是一種純粹面向?qū)ο蟮恼Z言,與現(xiàn)實生活聯(lián)系緊密。這種轉(zhuǎn)變平滑了學(xué)習(xí)曲線(當(dāng)然這在以后會變得非常困難)。
5.清晰的結(jié)構(gòu)
Java的語法非常結(jié)構(gòu)化。類中的一切都有助于理解相關(guān)的信息和功能。從第一句“你好,世界!”,您需要對類語法有一個基本的了解。在Java的幫助下,重要的原則、設(shè)計模式和編程范例可以很容易地得到解釋。
回顧以上原因,沒有理由討厭Java。Java曾經(jīng)是語言在2000年代。許多政府軟件和銀行都使用Java,其中一些現(xiàn)在仍在使用。
三、現(xiàn)在發(fā)生了什么?
不管人們怎么說,現(xiàn)在Java正在衰落。雖然Java仍然被維護著,全球仍然有許多Java開發(fā)者,但是作為編程語言,過去的輝煌現(xiàn)在已經(jīng)一去不復(fù)返了。
1.無效
作為“空引用”的創(chuàng)造者,東尼·霍爾在一次采訪中說,“這是一個十億美元的錯誤”,因為它會導(dǎo)致意想不到的行為和程序崩潰。Java在核心庫中采用了null,這使得它類似于在c中處理segfault錯誤。
2.剛性
在用Java編程一段時間后,您會注意到您多次編寫了相同的代碼。隨著技術(shù)的進步,Java中的樣板代碼激增,從而使其變得龐大。
3.沒有函數(shù)式語言支持
正如我前面所說,Java是純面向?qū)ο蟮?。然而,程序員需要命令式和聲明式語言都包含的特性。
4.繼承抽象中的一個缺陷
Java中有四種訪問說明符:公共的、受保護的、私有的和受包保護的/默認(rèn)的/友好的。沒有辦法允許對子類的訪問并限制對包中其他類的訪問。
四、Java歷史上的重要改進
1.Java 8的改進
Java維護者沒有忽視開發(fā)者的請求。
(1)功能支持—他們引入了流API的功能接口。然而,由于向后兼容,實現(xiàn)它仍然很笨拙。
(2)Optionalclass— Optional是無效問題的一種解決方法。盡管如此,包括Optional并沒有消除null的可能性,因為它在Java的核心庫中根深蒂固。
2.Java 12改進
表達式中引入Switch語句,減少了條件控制流中的一些樣板。
3.Java 16改進
Java中引入了record,它在編寫POJOs(普通的舊Java對象)時,刪除了大部分樣板文件。
五、Kotlin和Scala的到來
就像Java是對C++的改進一樣,Kotlin是對Java的改進。 Kotlin的優(yōu)勢如下:
1.大大減少了樣板文件。
2.根深蒂固的Null安全。
3.引入了字符串模板(受Python/PHP的啟發(fā))。
4.介紹sealed class(受Rust/Haskell啟發(fā))。
5.多范例語言(改進的OOP和融合性的功能)。
6.運算符重載(如C和Python)。
7.引入了data class(Java中的record)。
8.其他雜項功能,如擴展和內(nèi)聯(lián)函數(shù),以及協(xié)程。
因為我從未使用Scala編程,所以我不在文中討論它的好處。當(dāng)然,Java也在進化。
六、結(jié)論
僅僅因為更好的東西出現(xiàn)了,并不意味著我們厭棄了Java。
Java是明星編程語言,我們不能忽視它是如何幫助改變今天的編程語言的。Java的建立是為了解決一些問題,但作為副作用,它也產(chǎn)生了新的問題。在我看來,10年后,人們會開始抱怨今天的語言,一種新的語言將被創(chuàng)造出來解決這些問題。
如果沒有Java,現(xiàn)代語言不會像今天這樣強大。正如C++之父所言,世界上只有兩種語言:人們抱怨的語言和沒人使用的語言。