2

为什么Java不能根据文件夹结构弄清楚?

似乎根源文件夹加上该特定文件的路径已经指定了到包的映射。

它是完全耦合的,并且在没有 IDE 的情况下进行重构绝对是乏味的 - 尽管无论如何更新对该文件的引用,但它至少可以部分由编译器解决,而不是在文件级别指定包。

4

5 回答 5

5

JLS 7.2

每个主机系统决定如何创建和存储包和编译单元。

每个主机系统还确定在特定编译中哪些编译单元是可观察的(第 7.3 节)。编译单元的可观察性反过来决定了哪些包是可观察的,哪些包在范围内。

在 Java SE 平台的简单实现中,包和编译单元可以存储在本地文件系统中。其他实现可以使用分布式文件系统或某种形式的数据库来存储它们。

如果主机系统将包和编译单元存储在数据库中,则数据库不得对基于文件的实现中允许的编译单元施加可选限制(第 7.6 节)。

作为将包存储在文件系统中的一个极其简单的示例,项目中的所有包以及源代码和二进制代码可能存储在单个目录及其子目录中。该目录的每个直接子目录都将代表一个顶级包,即完全限定名称由单个简单名称组成的包。子目录的每个进一步级别将代表包含目录所代表的包的一个子包,依此类推。

另请阅读与您的问题密切相关的Compilation Units 。

注意:当您从命令行编译时,默认情况下,每个类将与相应的源文件放在相同的位置,但如果您使用“-d”选项,编译器将构建相应的输出目录。

于 2013-07-03T17:17:43.527 回答
1

目录结构和包名称声明的这种耦合不是 Java 语言的要求。它是由编译器实现强加的。正如Java 语言规范的第 7 章所解释的,编译单元根本不需要存储在文件系统中。它们可以很容易地存储在数据库中。此外,该语言允许包名称包含在底层文件系统的目录名称中可能是非法的字符。

来自 JLS:

作为将包存储在文件系统中的一个极其简单的示例,项目中的所有包以及源代码和二进制代码可能存储在单个目录及其子目录中。该目录的每个直接子目录都将代表一个顶级包,即完全限定名称由单个简单名称组成的包。子目录的每个进一步级别将代表包含目录所代表的包的一个子包,依此类推。

我们的大多数编译器显然都使用这种“极其简单”的方法的变体,即源代码和二进制代码存储在并行的层次结构中。但是关于语言的任何东西都不需要这个。

于 2013-07-03T17:19:25.470 回答
0

有包的主要原因是避免名称冲突..

因此,如果您希望编译器自动找出ArrayList类,它将无法做到,因为您可以拥有自己的类命名。编译器如何知道要使用哪个类。所以,您需要定义一个包名。ArrayList

于 2013-07-03T17:17:21.397 回答
0

文件夹结构和包虽然相关但不同。例如,一个名为“src”的 src 文件夹,它包含整个包层次结构,可能需要成为包的一部分。这尤其是从 Eclipse 等 IDE 的角度来看,您可以在其中创建具有任何继承权但与您的包结构无关的源文件夹。

作为编译器可能需要的规则,来自JLS的另一个有用信息:

存储在文件系统中的包可能对其编译单元的组织有一定的限制,以允许简单的实现轻松找到类。

于 2013-07-03T17:14:06.053 回答
0

Java 语言规范不要求目录/文件夹结构和包名称之间的紧密耦合。以下是 Java 在线教程的引述:

Java 平台的许多实现依赖于分层文件系统来管理源文件和类文件,尽管 Java 语言规范不要求这样做。

我所知道的所有 IDE 都根据目录结构管理包,但如果您真的想在没有 IDE 的情况下根据您自己选择的文件夹结构进行开发,仍然可以这样做。

于 2013-07-03T17:21:10.697 回答