代表性面试主题

编程面试:如何评估 Java 25 的 Module Import Declarations?

编程题中等
Offer.cc 编辑团队发布 更新

题干

团队准备把一个 Java 25 小工具改用 `import module`。你会如何判断它适合哪些代码,并处理隐式导入和名称冲突?

题干与适用场景

团队希望减少 Java 小工具和示例程序中的重复 import,计划在 Java 25 使用 Module Import Declarations。请说明它的语义、适用边界、冲突处理和迁移验证,不要只复述新语法。

面试官考察点

  • 是否知道模块导入会导入模块导出的包,而不是任意内部类型。
  • 是否能解释模块描述符、可读性关系和编译期名称解析的影响。
  • 是否考虑同名类型冲突、显式单类型导入优先级和 API 可读性。
  • 是否能提出兼容旧 JDK、构建工具和代码审查的迁移策略。

回答前需要澄清的问题

  1. 代码的最低运行 JDK 是多少,构建链是否已经支持 Java 25 语法?
  2. 目标文件是教学示例、命令行小工具还是长期维护的模块化服务?
  3. 依赖模块是否稳定导出所需包,是否存在多个包提供同名公开类型?
  4. 团队更在意减少样板代码,还是希望每个依赖都能被读者一眼审计?

30 秒回答框架

我会先确认项目编译和运行都在 Java 25 及以上,再把 import module 视为对模块导出 API 的批量导入,而不是万能的通配符。它适合依赖稳定、范围清晰的小型程序;公共库和安全敏感代码仍要评估显式导入的可读性。迁移时编译所有源集,故意加入同名类型测试,检查显式导入覆盖规则,并保留旧 JDK 的回退分支或明确升级门槛。

分步骤深入解答

1. 先理解导入范围

JEP 511 在 Java 25 将模块导入声明标准化。声明会把目标模块导出的包中的可访问类型带入当前编译单元;未导出的内部包不会因为该语法变得可见。模块系统的 requires 和可读性关系仍然决定代码能否访问这些类型。

2. 识别它与通配符导入的差异

模块导入以模块为边界,可能覆盖多个导出包;包通配符导入只覆盖一个包。下面的语法示例必须在启用 Java 25 的编译器中验证:

java
import module java.base;

class Tool {
    static void printSize(String value) {
        System.out.println(value.length());
    }
}

模块导入不会导入模块未导出的实现细节,也不会替代模块描述符中的依赖声明。

3. 处理名称冲突

不同导出包可能包含同名类型。遇到歧义时,使用单类型导入或完全限定名明确意图;不要依赖编译器偶然选择。显式导入应成为团队约定的一部分,让审查者能看出关键 API 来自哪个包。还要测试 java.lang 等隐式可见类型与模块导入同名时的优先级。

4. 规划迁移与兼容

先在独立源集启用 Java 25 编译,再运行完整测试、静态检查和打包任务。检查 IDE、格式化器、静态分析器和增量编译器是否理解新语法;库项目要评估消费者的最低 JDK。若必须支持旧版本,可继续使用显式导入,或让新语法只存在于 Java 25 专用模块,避免把运行时升级风险扩散到所有服务。

高质量示范回答

我会先确认最低 JDK、编译器和构建工具都支持 Java 25。import module 按模块边界导入其导出包中的可访问类型,不能访问未导出的内部实现,也不能替代 requires。它适合小型工具、示例或导出面稳定的模块;公共库和高审计代码要权衡样板减少与依赖可见性。迁移时对同名类型、java.lang 冲突和显式导入优先级做编译测试,并检查 IDE、静态分析和打包链。旧 JDK 消费者仍使用显式导入,直到升级门槛和兼容矩阵被验证。

常见错误

  • 把模块导入误解成可以访问模块内部所有包。
  • 认为它会自动增加模块的 requires 或改变模块可读性。
  • 忽略不同导出包的同名类型,导致编译歧义或错误 API。
  • 只升级本地 JDK,没有验证 CI、IDE、格式化器和打包工具。
  • 在公共库中盲目使用批量导入,降低依赖审计和跨版本兼容性。
  • 把 Java 25 语法发布给仍运行旧 JDK 的消费者。

追问及应对

模块导入与包通配符该怎么选?

模块导入适合希望按模块边界表达依赖、且导出面稳定的代码;包通配符更局部、更容易审计。公共 API 或同名类型较多时优先显式单类型导入,避免隐藏依赖。

遇到同名类型时编译器怎么处理?

如果多个导入候选都能匹配,代码会产生歧义。用单类型导入或完全限定名消除冲突,并把该选择写进代码评审规范;不要依赖导入顺序解决问题。

如何支持 Java 21 和 Java 25?

为不同运行时建立清晰的编译矩阵。共用源码继续使用显式导入;只有 Java 25 专用源集使用模块导入,并在发布前验证字节码、测试和依赖方的最低版本。

公开来源

同类题目

相关面试工具

用 Screenshot 处理算法题

截图题目后,按顺序看约束、解法、代码、边界条件和复杂度。

查看工具