java - java编译器如何解析非导入的名称

标签 java import token-name-resolution package-private

考虑我使用类型 X在我的 Java 编译单元中来自包 foo.barX未在编译单元本身中定义,也未直接导入。 Java 编译器如何解析 X现在有效率吗? X 有几种可能性可以居住:

  1. X可能通过明星进口进口 a.b.*
  2. X可能与编译单元位于同一个包中
  3. X可能是一种语言类型,即驻留在 java.lang

我看到的问题尤其是(2.)。自 X可能是包私有(private)类型,甚至不需要 X驻留在名为 X.java 的编译单元中.因此,编译器必须查看类路径的所有条目并搜索包中的任何类 foo.bar , 然后它必须读取包 foo.bar 中的每个类检查是否X包括在内。

听起来很贵。特别是当我只编译一个文件时,编译器必须读取几十个类文件才能找到一个类型 X .如果我使用大量 star 导入,则必须对很多类型重复此过程(当然,类文件不会被读取两次)。

那么是否建议从同一个包中导入类型以加快编译过程?或者是否有更快的方法来解析未导入的类型 X我找不到哪个?

最佳答案

That sounds very expensive.

如果编译器那样做,代价会很大。

但实际发生的是,它构建了一个内存数据结构,其中包含类路径、引导类路径和源路径上的所有类名,并将其用于在 javac 运行中编译的所有类中的所有类名解析.

So is it advisable to import also types from the same package to speed up the compilation process? Or is there a faster method for resolving an unimported type X which I was not able to find?

没有,也没有。这几乎没有什么区别。此外,如果您使用编译器的设计用途,这不太可能成为重大瓶颈。

最好以提供最具可读性和可靠性的代码的方式进行导入。

关于java - java编译器如何解析非导入的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24076971/

相关文章:

javascript - webpack中样式@import和js导入的区别

c++ - C++中定义上下文和实例化点之间非依赖构造的解释差异

c++ - 从属名称解析和命名空间标准/标准库

java - 重复添加

java - 如何修复凯撒密码程序中的 "char cannot be converted to java.lang.String"

python 使用argparse 导入脚本

javascript - 在模板 Web 组件中实现框架

java - Mysql异常

java - GSON 将 json 字符串转换为对象;获取空值和 0

c++ - 方法的声明改变了符号的含义