为什么Java中的文件名与公共类名相同?

为什么Java中的文件名与公共类名相同?,java,Java,在Java中,文件名应与该文件中包含的公共类的名称相同。为什么这是一个限制?它的用途是什么?它是由Java的制造商Sun制定的。 目的是组织;原因是,每个用Java编写代码的人都有一个统一的文件命名方式。更具体地说,文件名应该与该文件中的公共类名同名,这是告诉JVM这就是您的入口点。我想说的是,这只是一个必须。但我看了一下,并没有那么严格。从JLS的角度来看,编译器可以选择是否设置这样的限制 实际上,通用编译器确实有这种限制,而且,正如其他编译器所解释的,编译器查找编译单元或类加载器查找具有此类

在Java中,文件名应与该文件中包含的
公共类的名称相同。为什么这是一个限制?它的用途是什么?

它是由Java的制造商Sun制定的。

目的是组织;原因是,每个用Java编写代码的人都有一个统一的文件命名方式。

更具体地说,文件名应该与该文件中的公共类名同名,这是告诉JVM这就是您的入口点。

我想说的是,这只是一个必须。但我看了一下,并没有那么严格。从JLS的角度来看,编译器可以选择是否设置这样的限制


实际上,通用编译器确实有这种限制,而且,正如其他编译器所解释的,编译器查找编译单元或类加载器查找具有此类限制的类文件要容易得多。

每个公共类必须位于文件名与类名匹配的文件中,以及位于Packagename表示目录结构的包中,以虚线形式编写(斜线变成点,比如com/example/app变成com.example.app)

此约定不是随机的。编译器必须能够找到源文件,类加载器必须能够找到实现。匹配包名和类名使此操作非常简单,更重要的是,快速


此约定不适用于非公共类。这是因为非公共类的可见性非常有限,只能在定义它们的包中使用。因此,在这两种情况下,编译器和运行时环境都已经找到了正确的文件。

Java有一种有趣的方法:在哪里提供程序ammer a选项只能降低编程体验,删除该选项

他们在很多地方都这样做了。当然是文件名和包,但也不允许在一个文件中包含多个公共类(从来都不好),不允许在文件之间拆分类(很难使用!),等等

我真的希望他们能更进一步。没有理由使用公共变量:我从来都不需要公共变量,也从来没有见过有聪明的程序员认为公共变量是必要的并且是正确的

我也不介意看到方法/类大小的限制,但这可能会变得很粗略(代码检查器很容易实现,问题通常是最需要帮助的公司是那些不知道自己需要帮助的公司,因此不使用代码检查器之类的工具)

这对大多数小型团队来说并不重要,但当您的团队不断壮大,并拥有多个站点,其中有来自印度、中国和世界各地的顾问时,您将开始意识到这种僵化


针对setters/getter的评论:

Java Bean是Borland为了破解GUI而创建的一个令人憎恶的东西,然后被改造成Java

可怕的想法——从OO编程中分心——getter和setter a)显示了太多的实现,B)让您考虑对来自另一个对象的数据进行操作,而不是要求另一个对象为您执行操作。对于那些还不能在OO中思考的人来说,这是个糟糕的黑客

吸气剂偶尔需要,但不应添加,除非被认为是绝对不可避免的

应不惜一切代价避免二传。如果绝对需要在构造对象后从外部修改状态,请尝试使用生成器模式,并保护setter在执行任何操作后不被调用


很明显,每件事都有例外,许多“Getter”实际上是关键的对象业务逻辑,比如String.length(),不管String是如何实现的,它都是必需的,甚至不只是通过返回一个属性来实现——这对于“Getter”来说是一个很好的例子如果您想这样称呼它。

它在定位类时很有用。i、 e.假设允许使用不同的文件名,并且如果您创建了一个类的实例,则编译器必须在所有文件中搜索该类,如果文件名与该类的文件名相同,则查找和使用该类的性能会提高。它们也可能是其他原因。

只要不是公共的类的名称可以与其文件名不同。该类也可以有main方法。类文件将使用类名而不是源文件名生成。应该使用类名来执行它


原因是:默认类是包私有类,因此,javac不必找到这个源文件来编译包外的其他java程序。

这个问题应该重新表述:为什么任何语言都会故意让查找源代码变得更加困难,而允许任意文件/类命名不匹配?就语言规范而言考虑到这一点,源代码甚至不需要包含在文件中。这是编译器处理文件中源代码的惯例。非公共的默认访问(“包私有”)类可以在同一个包中的任何地方使用。是的,这实际上是一个输入错误。它们可以在包装内使用,但不能在其他地方使用。私有类只能在它们定义的文件中使用。当Java被设计时,getX/setX范式还没有建立。我相信这是JavaBean必须编码到接口的结果,在接口中不能有公共变量。我希望Java也能对非公共类实施这一点。实际上存在类和方法大小限制,它们太大了,以至于在实践中无法使用。如果类实际上是一个gloriried结构,并且只有公共变量,那么公共变量就很有用