模块导入声明 - Java 23 新特性

作为 Java 程序员,对 import 声明肯定并不陌生。通过 import 声明,可以导入单个类型,也可以使用通配符来按需导入。举例来说,如果需要使用 Java 集合框架中的 List 类型,可以使用 import 导入 java.util.List,也可以使用通配符来导入 java.util.*。

每个 Java 源文件都会默认导入 java.lang 包。实际上,很多常用的类并不包含在 java.lang 包中,需要显式地导入。比如集合类中的 List、Set 和 Map,进行文件操作的 Path 和 File。显式地导入这些常用类型,代码会变得冗长。

OpenJDK 23 中新增的模块导入声明,可以自动导入一个模块所导出的全部公开的顶层类和接口,以及该模块所读取的其他模块所导出的类型。对于第二条规则,导入一个模块,会同时导入该模块所传递依赖的其他模块。

d5cedea519bd1ec7f51416fe84f56ec4.png

使用 import module 加上模块名称的方式来导入一个模块。比如,import module java.base 会导入 java.base 模块,相当于按需导入 java.base 模块中的 54 个包。

import module java.base;

在目前的开发实践中,在使用 import 时,推荐的做法是只导入单个类型。这样代码的可读性更好,也更清晰。模块导入声明,这种一次性导入全部包的做法,在实际的开发中并不推荐。

模块导入声明的使用场景,是在项目开发的早期阶段,或是开发应用的原型,或是探索 API 的使用。

由于模块导入声明会导入很多的包,这些包中的类型的名称可能会产生冲突。比如,java.base 和 java.sql 模块中都有 Date 类,分别是 java.util.Date 和 java.sql.Date。同时导入这两个模块之后,直接使用 Date 类型会出错,因为不确定用的是哪个包中的 Date。解决的方法也很简单,只需要用 import 再导入一次所需的类型即可。

在下面的代码中,实际使用的是 java.sql.Date 类型。

6bb3518a2d6f57a4e06d6fd83cbbe8c5.png

对于隐式声明的类,会自动导入 java.base 模块。这样就进一步简化了代码的编写,可以去掉很多不必要的 import 语句。在下面的代码中,用到了Java 的集合类和流处理,并不需要额外的 import 语句,因为已经自动导入了 java.base 模块。

void main() {
  String[] fruits = new String[] { "apple", "berry", "citrus" };
  Map<String, String> m =
      Stream.of(fruits)
          .collect(Collectors.toMap(s -> s.toUpperCase().substring(0,1),
              Function.identity()));
  System.out.println(m);
}

模块导入声明目前是 JDK 23 的预览功能,编译和运行时,都需要添加 --enable-preview 参数。

下面的图片展示了如何运行上述的使用了隐式声明类的代码。运行时,使用的是 OpenJDK 23 的 Early Access 版本。

93c724482984f08537a7ade73ceabada.png

总结一下,使用 import module 来导入一个模块,导入该模块所导出的全部公开的顶层类和接口。导入一个模块,会导入该模块所传递依赖的其他模块。不建议在生产代码中使用模块导入声明。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值