作者 | Peter Wayner
編譯 | 星璇
出品 | 51CTO技術(shù)棧(微信號:blog51cto)
走過近30年,Java早已不再是當初的Java了。它變老了?還是變時髦了?
Java很古老嗎?是的,這是一種由老前輩使用的編程語言,他們喋喋不休地談論著高光的前端面板和軟盤時代。
Java依舊時髦嗎?是的,它仍然擁有著所有最新的語言增強功能,用于直觀編碼和一流性能?
也許Java介于兩者之間:外表成熟,但內(nèi)心年輕。
1995年5月23日,Java正式進入世界,距今已有近30年。
它最初是一種名為“Oak”的機頂盒技術(shù),Sun Microsystems公司認為該技術(shù)很快就會占領(lǐng)美國客廳。但該計劃起初并未成功。但該語言發(fā)展成為現(xiàn)代軟件的核心基礎之一,運行于從小型傳感器芯片到大型服務器盒的任何設備上。從那時起,Java的理念發(fā)生了巨大的變化。
Sun和Oracle在嫁接功能方面做得非常出色,這些功能讓語言感覺新鮮,而不會過多地干擾核心功能。也許Java只是那些不斷發(fā)展下去的語言中的一種而已。
事實上,在名為“Java”的大帳篷中生活的許多功能與最初設想的有所不同,通常是根本性的不同。程序員正在創(chuàng)建1995年、2005年甚至2015年的人們不會認出的代碼,但舊代碼仍在運行。這是一種高質(zhì)量的處理藝術(shù)。
2010年收購Sun公司的甲骨文公司現(xiàn)在定期發(fā)布新版本,并添加功能以保持Java語言的相關(guān)性。
以下是Java發(fā)生變化的十一種方式,大多數(shù)都是朝著更好的方向發(fā)展。
Java編程比以前更好的10個理由:
虛擬線程、結(jié)構(gòu)化并發(fā)、不可變數(shù)據(jù)、垃圾收集、模式匹配、簡化的語法、密封類、外部函數(shù)和內(nèi)存、矢量API、改進的空值處理
Java變得不好的一個理由:
免費,就像付費許可一樣?
Java的原始版本為開發(fā)人員提供了創(chuàng)建自己的Thread對象并控制代碼在多線程和多核環(huán)境中運行的方式的機會。雖然總比沒有好,但程序員很快發(fā)現(xiàn)Thread對象相當龐大,創(chuàng)建和銷毀需要花費太多時間。在程序開始時創(chuàng)建一個永久線程池成為解決笨重線程的常用方法。
隨著虛擬線程的出現(xiàn),Java 19中的所有情況都發(fā)生了變化。現(xiàn)在,JVM處理了Java程序中分配系統(tǒng)資源的大部分工作。程序員指定并行何時可用,運行時JVM在可能的情況下并發(fā)運行代碼。虛擬線程對微服務等現(xiàn)代架構(gòu)來說是一個福音,它們更容易開發(fā)和支持。
較輕的線程只是一個開始。Java正在添加一個抽象的并行模型,這將使程序員和JVM更容易同時處理工作負載。新的結(jié)構(gòu)化并發(fā)模型為程序員提供了將Java工作負載分解為任務的機會,然后將這些任務分組到范圍中。Scopes被收集成在同一個線程中一起工作的纖維。
圖片
其目標是為Java開發(fā)人員提供一個用于構(gòu)建并行程序的標準樣板模型,因此他們不需要每次都對此進行深入的推理。結(jié)構(gòu)化并發(fā)還使虛擬機更容易檢測并發(fā)執(zhí)行的機會,并將其映射到處理器核心。
一開始,String是固定的。一旦創(chuàng)建了字符串,它就永遠無法更改。調(diào)用像toLowerCase之類的函數(shù)會創(chuàng)建一個全新的String。這使得JVM更容易管理跨線程的安全性和同步性。
現(xiàn)在,Java程序員可以通過調(diào)用“Records”來為自己的對象指定相同的不可變規(guī)則。這簡化了多線程安全、緩存和同步。代碼中會列出了字段的名稱和類型,JVM處理其余部分。equals、 hashCode 和 toString 等常用方法會自動創(chuàng)建。其余時間,JVM 確保記錄是不可變的,這簡化了許多程序細節(jié)并加速了運行代碼。
Java總是處理內(nèi)存分配和回收的許多細節(jié),這是許多程序員樂于委托給JVM的一項功能。不過,有時,原始垃圾收集器會暫停足夠長的時間,以至于用戶會注意到性能滯后。
如今,程序員可以在四個垃圾收集器之間進行選擇,它們使用各種不同的垃圾收集算法,專門用于不同類型的應用程序:
Garbage First(G1)垃圾回收器是默認的選擇,它能以更短的暫停時間提供更好的吞吐量。
G1采用了從早期Java垃圾收集迭代中吸取的經(jīng)驗教訓中發(fā)展起來的技術(shù),比如對最大的塊進行混洗,以及對頻繁更改的小對象進行精細調(diào)整的識別。
Z垃圾收集器被設計為非常低的延遲,這是web服務器、流服務和其他實時數(shù)據(jù)工作的要求。它也可以很好地處理非常大的堆,因為它的設計可以擴展到16 TB的RAM。
并發(fā)垃圾回收器將在后臺運行,而不會停止應用程序。它最適合像交互式應用程序這樣永遠不應該暫停的工作,盡管它可能沒有那么高效。
最后,并行收集器使用多個線程更快地收集數(shù)據(jù),但停止更不可預測。
圖片
開發(fā)人員不必拘泥于單一的垃圾收集方法,也不必求助于其他解決方案,如通過重用對象來模擬自己的內(nèi)存管理。現(xiàn)在有四個主要的選擇,每一個都提供了更多的調(diào)整和實驗選項。
Java團隊還在一些最低的語法級別上增強了該語言,為開發(fā)人員提供了更多的選擇來編寫更干凈、更具表現(xiàn)力的邏輯。switch關(guān)鍵字用于創(chuàng)建if-then-else條件的堆棧,現(xiàn)在提供了模式匹配,這意味著指定各種情況的邏輯不限于equals等基本表達式。
用這些模式編寫的Java代碼特別簡潔,不僅可以區(qū)分數(shù)據(jù)中的值,還可以區(qū)分對象類型。可以使用所有引用類型和空指針。當然,仍然支持更傳統(tǒng)的帶有失敗語義的邏輯,因此舊代碼可以繼續(xù)平穩(wěn)運行。
一開始,編寫Java與編寫C或C++沒有太大區(qū)別。花括號和分號在Java中的作用與在C中的作用大致相同。循環(huán)是用經(jīng)典的三部分形式構(gòu)建的。盡管它的內(nèi)部與Lisp有著深刻的聯(lián)系,但Java的基本語法與C的沒有太大區(qū)別。
不過,最近添加的內(nèi)容都借鑒了Ruby和Python等腳本語言的簡單性。For循環(huán)不需要拼寫出每一個細節(jié),因為編譯器現(xiàn)在可以在循環(huán)列表或數(shù)組時直觀地顯示它們。對于想要保存擊鍵的程序員來說,匿名函數(shù)和lambda表達式也是不錯的選擇。C的一些冗長和多余的標點符號仍然存在,但今天的Java程序員可以用更少的字符拼寫出復雜的結(jié)構(gòu)。
從一開始,JVM的設計就是為了防止程序員錯誤地在程序中留下許多常見的安全漏洞。最新版本增加了更多選項。例如,密封類允許類創(chuàng)建者準確地指定哪些類可以擴展它。
這可以防止其他使用庫的人擴展類并添加或重寫一些原始功能。密封類的運行速度也比傳統(tǒng)類快一點,因為它們允許更積極的優(yōu)化和內(nèi)聯(lián)。它們還可以簡化方法調(diào)度。
Java虛擬機被設計成一個有圍墻的花園或一個類型安全的沙箱。虛擬機保護代碼并防止代碼在本機運行時可能發(fā)生的許多一般攻擊。對于程序員來說,最初的Java Native Interface(JNI)有點像后門。Java團隊知道一些開發(fā)人員需要連接到用其他語言編寫的庫和堆棧,并且一些系統(tǒng)調(diào)用是必不可少的。因此,他們在JVM的盔甲上打開了這個洞,并簡單地警告了使用它的危險。
現(xiàn)在,我們有了外部函數(shù)和內(nèi)存API,目前是第三次預覽中的JEP。這個API將使它更容易和更安全地與外部連接。現(xiàn)在,更多的工作可以用純Java編寫,這為普通Java程序員打開了開始連接到通用系統(tǒng)內(nèi)存的機會。該提案還增加了更好的防護措施,如類型檢查,以阻止一些最嚴重的潛在溢出攻擊。這個API將使Java代碼更容易承擔系統(tǒng)編碼中更低級的任務和數(shù)據(jù)處理。對于Java程序員來說,這是一種更安全的方式來開始突破沙箱。
圖片
許多資深Java程序員都知道最初的Vector類,它更多的是一種數(shù)據(jù)結(jié)構(gòu),而不是一種數(shù)學工具。這是一個靈活且同步的解決方案,用于存儲與List沒有太大區(qū)別的對象。
新的 Vector API是更多。這是一種數(shù)學數(shù)據(jù)處理工具,隨著人工智能算法以與物理科學家和數(shù)學家或多或少相同的方式使用矩陣和向量,這種工具變得越來越普遍。單個元素可以是原始類型,并且支持許多基本的數(shù)學運算,如點積。
圖片
查看Vector類和API之間的區(qū)別的一個好方法是查看add方法的作用。在原始類中,它只是像所有其他Collections類一樣,將一個對象粘貼在數(shù)據(jù)結(jié)構(gòu)的末尾。在API中,它用于在數(shù)學上添加單個元素,更像工程師所期望的那樣。Vector API還承諾開放一些較新的SIMD處理器的巨大計算能力,使Java程序員能夠編寫出可以在許多長向量中進行轉(zhuǎn)換的代碼。
那個對象是空指針嗎?許多Java代碼專門用于檢查、雙重檢查和三重檢查對象。為了簡化代碼并加快速度,Java一直在緩慢地添加以更優(yōu)雅的方式處理空指針的功能。
例如,Stream API可以處理長數(shù)據(jù)流,并且不會在偶爾出現(xiàn)空值時掛斷。Optional類包裝器可能包含也可能不包含實際對象,從而使代碼能夠很好地流動。如果你仍然想檢查null,有一個null安全運算符(?.)可以以非常簡潔的方式測試null。
圖片
Java一直是免費的,至少對程序員來說是這樣。從一開始,Sun公司就想用免費的工具和硬件吸引開發(fā)人員,1997年,該公司大膽地將語言的許多部分及其虛擬機開源。直到最近,開發(fā)人員都可以或多或少地一次編寫并在任何地方運行,而不用支付一分錢。
現(xiàn)在的情況,似乎變得更加不明朗。甲骨文的許多Java版本都是免費的,但有些需要奇怪的條款授權(quán)。看起來甲骨文希望程序員享受創(chuàng)建的自由,不受金錢限制,但也希望從那些從Java中獲得大量長期收入的企業(yè)中提取稅收或租金。事實上,甲骨文通過所謂的Java訂閱功能來進行收費。
可以這樣說,Java現(xiàn)在仍然是免費的,除非你想升級它用于商業(yè)用途。
圖片
原文鏈接:https://www.infoworld.com/article/3711866/11-reasons-the-new-java-is-not-like-the-old-java.html
本文鏈接:http://www.tebozhan.com/showinfo-26-66200-0.html走過近30年:Java外表成熟,內(nèi)心依舊少年
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com