为什么Java源文件使用其包含的公共类的名称?


14

我是学习Java的新手。在Java中,每个源文件必须包含一个公共类,并且该源文件应具有与该公共类相同的名称。此外,任何源文件都不能包含两个公共类。为什么会有这个限制?


4
没有细节,这是Java设计方式的历史设计产物。最新设计的语言(如C#)与Java类似,但没有此限制。
gahooa

13
是不是要强制执行最佳做法?我以为这是唯一原因。在C#中,您在技术水平上没有此限制,但是如果文件名和类名不匹配或同一文件中有多个类,StyleCop仍会抱怨。Visual Studio还在大力鼓励类文件关系(请考虑为您创建文件的类图,或者重命名.cs文件时,Visual Studio也会询问您是否也要重构类的名称)。
阿森尼

在旧式编译语言中,链接器会找到所有引用和外部符号。但是Java没有链接-您可以在运行时加载jar。如果没有链接步骤,那么如果您知道要查找的文件名,尝试将类名映射到类路径中的位置会快得多。
Paul Tomblin,2012年

4
@gahooa这不是设计工件,它是故意设计的决定。这使许多事情变得容易得多。

1
使用grep呢?
用户

Answers:


19

在他的一位Java专家通讯中,Heinz Kabutz深入研究了Oak语言规范。他写:

为什么每个公共类都放在单独的文件中?(第1节)

这是我在课程中经常问到的一个问题。到目前为止,我对这个问题还没有一个好的答案。在第1节中,我们读到:“尽管每个Oak编译单元可以包含多个类或接口,但是每个编译单元最多可以是一个类或接口是公共的”。

在侧栏中,它解释了原因:“尽管有效导入软件包是必需的,但编译器尚未实施此限制”

很明显-就像大多数事情都知道设计原因一样-编译器将不得不遍历所有编译单元(.java文件)以找出哪些类在哪里,这将使编译速度更加慢。

http://www.javaspecialists.eu/archive/Issue055.html


1
稍微加快编译速度?真?不是因为它使您的代码更有条理?我非常怀疑这是正确的答案。
BlueRaja-Danny Pflughoeft

1
@ BlueRaja-DannyPflughoeft 1998年,我敢肯定它会带来更大的变化
TheLQ 2012年

8

我能想到的原因

  • 使编译器在开始时查找其他类稍微容易一些,因为它不必在所有可能的数千个类文件中搜索随机的公共类,它可以直接转到该文件。
    • 这可能不再重要,只是开始了从未改变的早期约定
  • 在编译中,对文件的更改只会影响该文件。如果有多个类,则必须重新编译所有内容
  • 最佳实践-在同一个文件中有多个公共类会使事情变得混乱。文件的目的是组织源代码,文件夹的目的是组织文件。如果特定程序包的所有类都在单个100 MB的超级文件中,那么您将失去所有优势,而没有获得文件的任何优势(加上编辑时增加的麻烦)

1
类和接口不一定代表源代码最自然的细分级别。将成千上万行代码整合到一个文件中是不方便的,但是在十几个源文件中散布着100行“真实”内容(不包括注释或重复的编译器指令)也不是很方便。我不知道它是如何工作的,如果命名为类型的文件必须要么包含定义或者确定是否文件?
超级猫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.