为什么Java不能根据文件夹结构搞清楚?
似乎已经通过根源文件夹以及该特定文件的路径指定了到包的映射。
它是完全耦合的,并且在没有IDE的情况下进行重构是非常繁琐的 - 虽然更新对该文件的引用仍然是,但它至少可以部分地被编译器弄清楚,而不是在文件中指定包水平。
答案 0 :(得分:5)
来自JLS 7.2
每个主机系统确定如何创建和存储包和编译单元。
每个主机系统还确定特定编译中哪些编译单元是可观察的(第7.3节)。反过来,编译单元的可观察性决定了哪些包是可观察的,哪些包在范围内。
在Java SE平台的简单实现中,包和编译单元可以存储在本地文件系统中。其他实现可以使用分布式文件系统或某种形式的数据库来存储它们。
如果主机系统在数据库中存储包和编译单元,则数据库不得对基于文件的实现中允许的编译单元施加可选限制(第7.6节)。
作为在文件系统中存储包的一个非常简单的示例,项目中的所有包和源代码以及二进制代码可能存储在单个目录及其子目录中。此目录的每个直接子目录都代表一个顶级包,即一个完全限定名称由一个简单名称组成的包。每个更高级别的子目录将表示由包含目录表示的包的子包,依此类推。
另请阅读与您的问题密切相关的Compilation Units。
注意:从命令行编译时,默认情况下,每个类都将放在与相应源文件相同的位置,但如果使用“-d”选项,编译器将构建适当的输出目录。
答案 1 :(得分:1)
目录结构和包名称声明的这种耦合不是Java语言的要求。它由编译器实现强加。如Chapter 7 of the Java Language Specification中所述,编译单元根本不需要存储在文件系统中;它们可以很容易地存在于数据库中。此外,该语言允许包名称包含在基础文件系统中的目录名称中可能是非法的字符。
来自JLS:
作为在文件系统中存储包的一个非常简单的示例,项目中的所有包和源代码以及二进制代码可能存储在单个目录及其子目录中。此目录的每个直接子目录都代表一个顶级包,即一个完全限定名称由一个简单名称组成的包。每个更高级别的子目录将表示由包含目录表示的包的子包,依此类推。
我们的大多数编译器显然使用这种“极其简单”方法的变体,其中源代码和二进制代码存储在并行层次结构中。但是没有关于语言的要求。
答案 2 :(得分:0)
文件夹结构和包虽然相关但不同。例如,一个名为'src'的src文件夹,它包含整个包层次结构,可能需要成为包的一部分。特别是从像eclipse这样的IDE的角度来看,你可以创建任何继承人但与你的包结构无关的源文件夹。
编译器可能需要JLS作为规则的另一个有用信息:
存储在文件系统中的软件包可能具有某些约束 关于他们的编译单元的组织,允许一个简单的 实现轻松找到类。
答案 3 :(得分:0)
包装的主要原因是避免名称冲突..
因此,如果您希望编译器自动找出ArrayList
类 ,它将无法执行此操作,因为您可以拥有自己的名为ArrayList
的类编译器如何知道要使用哪个类。因此,您需要定义一个包名。
答案 4 :(得分:0)
目录/文件夹结构与包名称之间没有Java语言规范的紧密耦合。以下是Java在线教程的引用:
Java平台的许多实现都依赖于分层文件 管理源文件和类文件的系统,尽管是Java语言 规范不要求这样。
我所知道的所有IDE都根据目录结构管理包,但是如果你真的想在没有IDE的情况下开发并根据你自己选择的文件夹结构进行开发,那么仍然可以这样做。