限时领|《AI 百问百答》专栏课+实体书(包邮)! 了解详情
写点什么

JDK 25 将实例主方法从预览特性转为最终特性

  • 2025-05-25
    北京
  • 本文字数:1830 字

    阅读完需:约 6 分钟

大小:715.86K时长:04:04
JDK 25将实例主方法从预览特性转为最终特性

从 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.utiljava.iojava.math包中的常用类(比如,ListArrayListFileBigDecimal)。因此,无需显式导入即可直接使用这些类:

// 使用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

2025-05-25 16:004293

评论

发布
暂无评论

通义家族大模型总结

多啦A梦

大模型

广西汽车集团携手时习知打造数字化学习平台,加速人才转型

轶天下事

专业直观Git客户端:Fork 免激活最新

胖墩儿不胖y

git Mac软件

25 | 红黑树(上):为什么工程中都用红黑树这种二叉树

鲁米

Helio 升级为 LISTA DAO,开启多链时代新篇章并宣布积分空投计划

股市老人

实用编程技巧:MybatisPlus结合groupby实现分组和sum求和

知识浅谈

MyBatisPlus Mybatis-Plus

闲聊ArrayList的那些事儿

是月月啊2023

Java 面试题

我与Stable Diffusion的“缘”

AI 大模型训练 Stable Diffustion 大模型推理

2023-12-09:用go语言,给你两个整数数组 arr1 和 arr2, 返回使 arr1 严格递增所需要的最小「操作」数(可能为 0)。 每一步「操作」中,你可以分别从 arr1 和 arr2

福大大架构师每日一题

福大大架构师每日一题

qemu单步调试arm64 linux kernel

无人知晓

qemu 内核调试 linux

qemu 单步调试linux driver

无人知晓

qemu driver 单步调试

qemu调试kernel启动(从第一行汇编开始)

无人知晓

qemu kernel 内核调试 linux

22 | 哈希算法(下):哈希算法在分布式系统中有哪些应用

鲁米

19 | 散列表(中):如何打造一个工业级水平的散列表

鲁米

23 | 二叉树基础(上):什么样的二叉树适合用数组来存储

鲁米

qemu + vscode图形化调试linux kernel

无人知晓

Linux Kenel qemu 内核调试 linux

SpringSecurity全限验证实战!

是月月啊2023

Java 面试题

24 | 二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树?

鲁米

app开发

Geek_8da502

SQL PRIMARY KEY 约束- 唯一标识表中记录的关键约束

小万哥

MySQL 数据库 sql 程序员 后端开发

ADA算力DAPP挖矿系统开发丨详情

l8l259l3365

手撸了一个API网关,代码已上传,自取~

是月月啊2023

Java

Python终于可以操作Office了

程序员晚枫

Python 自动化办公 入门版

DevOps|研发提效-敏捷开发之任务看板

laofo

DevOps Scrum 敏捷 敏捷开发 研发效能

20 | 散列表(下):为什么散列表和链表经常会一起使用

鲁米

qemu搭建arm64 linux kernel调试环境

无人知晓

JDK 25将实例主方法从预览特性转为最终特性_编程语言_A N M Bazlur Rahman_InfoQ精选文章