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