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

时间:2010-01-25 19:01:22

标签: java

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

7 个答案:

答案 0 :(得分:45)

Java有一个有趣的方法:给程序员一个选择只会降低编程经验,删除选择。

他们在很多地方做过这件事。文件名和包肯定,但也不允许文件中的多个公共类(永远不会好),不允许你在文件之间拆分类(该死的很难使用!)等。

我真的希望他们走得更远。公共变量是没有理由的:我从来不需要一个,也没有见过一些聪明的程序员认为需要一个并且实际上是正确的情况。

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

这对大多数小型团队来说并不重要,但是当您的团队成长并拥有多个来自印度,中国和世界各地其他地方的顾问的网站时,您将开始意识到缺乏灵活性。


回应setter / getters评论:

Java bean是Borland创建的一个令人厌恶的东西,用于破解他们的GUI,然后改装成Java。

可怕的想法 - 从OO编程中分散注意力 - Getters和setter A)显示太多的实现和B)让你思考从另一个对象的数据操作而不是要求另一个对象执行操作为了你。对于那些无法在OO中思考的人来说,这是一个糟糕的行为。

偶尔需要吸气剂,但除非被视为绝对不可避免,否则不应添加吸气剂。

应该不惜一切代价避免塞特犬。如果在构造对象后绝对需要从外部修改状态,请尝试使用构建器模式,并防止在执行任何操作后调用setter。

一切都有明显的例外,许多“Getters”实际上是关键对象业务逻辑,比如String.length(),无论String如何实现都是必需的,甚至不通过返回属性来实现 - - 如果你想把它称之为“Getter”,这是一个很好的例子。

答案 1 :(得分:17)

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

实际使用 - 常见的编译器确实有这种限制,并且正如其他已经解释的那样,编译器更容易找到编译单元或类加载器来查找具有这种限制的类文件。

答案 2 :(得分:10)

更具体地说, filename 应该与该文件中的公共类名具有相同的名称,这是告诉JVM这是什么的方法切入点适合你。

答案 3 :(得分:5)

由Java制造商Sun设定的the convention 目的是组织;原因是每个使用Java编码的人都会有一种一致的命名文件方式。

答案 4 :(得分:2)

每个公共类必须位于FileName与ClassName匹配的文件中,以及Packagename表示Directory结构的包,以虚线形式写入(斜杠变为点,如com / example / app变为com.example。应用程序)。

此惯例不是随机的。编译器必须能够找到源文件,并且类加载器必须能够找到实现。匹配包名和类名使得这非常简单,而且更重要,更快。

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

答案 5 :(得分:1)

在查找课程时非常有用。即假设允许使用不同的文件名,如果你创建了一个类的实例,那么编译器必须在所有文件中搜索该类,如果文件名与该类的相同,则查找和使用该类的性能是增加。他们可能也是其他原因。

答案 6 :(得分:-1)

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

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