作者 | A N M Bazlur Rahman
譯者 | 張衛濱
策劃 | 丁曉昀
從 JDK 21 開始,經過了四輪的全面預覽周期,JDK 25 終于集成了 JEP 512,緊湊源文件和實例主方法(Compact Source Files and Instance Main Methods)。這些功能以前被稱為“隱式聲明類和實例主方法(Implicitly Declared Classes and Instance Main Methods)”,現在該特性已在 JDK 25 中最終確定。這一演變引入了一些精煉的概念,如緊湊源文件、靈活的實例主方法、新的控制臺 I/O 輔助類java.lang.IO
,以及核心庫的自動導入。它的主要目標是為初學者提供一個易于使用的 Java 語言入門途徑,同時也使有經驗的開發人員能夠在制作腳本和原型時大大減少繁瑣的過程。
該倡議與甲骨文公司 Java 語言架構師 Brian Goetz 在 2022 年 9 月的博客文章“Paving the On-Ramp”中闡述的愿景不謀而合。此外,甲骨文公司技術顧問 Gavin Bierman 最近 發布 了初步 規范草案,供社區審查。
傳統上,即使是最簡單的 Java 程序也需要明確的類聲明:
// 傳統的"Hello, World!"
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
JEP 512 通過引入隱式聲明的類解決了這一復雜性。如果源文件 (.java
) 包含顯式類聲明之外的方法或字段,Java 編譯器會將這些內容視為屬于一個未命名的、隱式聲明的頂層類。這大大簡化了初學者的程序:
// 使用 JEP 512 特性的"Hello, World!"
void main() {
IO.println("Hello, World!");
}
作為對隱式聲明類的補充,JEP 512 引入了對實例方法作為程序入口點的支持。對于較簡單的情況,放寬了對靜態入口點(public static void main(String[] args)
))的歷史要求。
Java 啟動協議現在可以識別實例主方法。如果選擇啟動的類缺乏合適的靜態主方法,啟動器就會搜索實例主方法。首選的實例入口點簽名非常簡單:
void main() {
// 程序邏輯
}
對于涉及命令行參數的情況,它還支持另一種簽名void main(String[] args)
。采用這種方法,初學者無需立即處理static
關鍵字或String[] args
參數。使用實例主方法時,Java 啟動器會在調用主方法之前自動實例化類。
為了解決另一個常見的復雜問題,也就是從System.in
讀取內容和通過System.out.println
打印內容的問題,JEP 512 引入了一個工具類java.lang.IO
。該類位于java.lang
包中,無需顯式的導入語句就可以隱式地使用。它為基本的控制臺交互提供了基礎的靜態方法:
public static void print(Object obj);
public static void println(Object obj);
public static void println();
public static String readln(String prompt);
public static String readln();
這有助于進行簡單的交互式編程:
// 使用 java.lang.IO 的簡單交互式程序
void main() {
String name = IO.readln("Please enter your name: ");
IO.print("Pleased to meet you, ");
IO.println(name);
}
值得注意的是,雖然IO
類本身不需要導入,但其靜態方法不再像早期的預覽版本那樣會被隱式導入到緊湊源文件中。除非使用顯式的靜態導入,否則開發人員必須明確進行限定方法調用(比如,IO.println(...)
)。這一調整可確保在將緊湊源文件轉化為常規類時實現更平穩的過渡,避免出現靜態導入等突然出現的額外要求。
為進一步減少模板式代碼,尤其是對不熟悉包結構的初學者而言,緊湊型源文件現在能夠自動訪問java.base
模塊導出的包中所有的公共頂層類和接口。這種隱式導入方式類似于配套 JEP 中提出的聲明(import module java.base;
),它提供了對常用類的無縫訪問,如java.util
、java.io
和java.math
包中的常用類(比如,List
、ArrayList
、File
、BigDecimal
)。因此,無需顯式導入即可直接使用這些類:
// 使用 List 的緊湊源文件,無需顯式導入
void main() {
var authors = List.of("Bazlur", "Shaaf", "Mike"); // List 會被自動導入
for (var name : authors) {
IO.println(name);
}
}
JDK 25 中最終確定了緊湊源文件、實例主方法、java.lang.IO
類以及java.base
模塊的自動導入,這標志著 Java 在改善學習曲線和簡化小型程序開發方面的重大改進。通過降低初始的復雜性,這些增強功能有助于 Java 在不同場景的逐步引入,而不會影響向高級編程結構的平穩過渡。最重要的是,這些功能保持了兼容性,并無縫集成到了標準 Java 工具鏈中,鞏固了它們作為核心組件而非孤立方言的地位。如果得到廣泛采用,這些改進將對 Java 教育和開發人員制作簡單實用程序和原型的方法產生深遠影響。
Instance Main Methods Move from Preview to Final in JDK 25
聲明:本文由 InfoQ 翻譯,未經許可禁止轉載。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.