从 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 语言入门途径,同时也使有经验的开发人员能够在制作脚本和原型时大大减少繁琐的过程。摘要:从 JDK 21 开始,经过了四轮的全面预览周期,JDK 25 终于集成了 JEP 512,紧凑源文件和实例主方法(Compact Source Files and Instance Main Methods)。这些功能以前被称为“隐式声明类和实例主方法(Im
该倡议与甲骨文公司 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 教育和开发人员制作简单实用程序和原型的方法产生深远影响。原文链接:
来源:InfoQ