Java类命名规则

Java类命名规则,java,naming-conventions,Java,Naming Conventions,在JAVA中,类名必须始终与文件名相同,但有时文件包含多个类。文件中只有一个类(或接口)可以是公共的,并且它必须与文件同名。但是,如果文件名包含多个非公共类(或接口),如何确定文件名 interface Foo {} class Bar{} 有些人似乎对这个问题感到困惑 事实上,我知道无论我选择Foo还是Bar作为文件名,它都会起作用。然而,我感兴趣的是,是否存在命名类的某种约定 为什么我不给它取个我喜欢的名字呢?因为我实际上正在编写一个重构代码的应用程序,每当它重命名类时,我都需要知道如何

在JAVA中,类名必须始终与文件名相同,但有时文件包含多个类。文件中只有一个类(或接口)可以是公共的,并且它必须与文件同名。但是,如果文件名包含多个非公共类(或接口),如何确定文件名

interface Foo {}

class Bar{}
有些人似乎对这个问题感到困惑

事实上,我知道无论我选择Foo还是Bar作为文件名,它都会起作用。然而,我感兴趣的是,是否存在命名类的某种约定

为什么我不给它取个我喜欢的名字呢?因为我实际上正在编写一个重构代码的应用程序,每当它重命名类时,我都需要知道如何以及何时更改文件名

到目前为止,我认为正确的方法是:

如果类有一个公共节点,则使用它的名称作为文件名,
否则只需选择第一个节点,因此在本例中,Foo将获胜。因此,我简化了问题:这是正确的方法,还是还有其他方法?

有两条规则需要遵循:

第一条规则:类可以具有包(默认)或公共可见性


第二条规则:您定义为公共的类必须在.java源文件中以相同的名称实现,但是非公共的类可以在源文件中以其他名称实现。

引用java语言规范,第7.6节:

如果且仅当包存储在文件系统(§7.2)中时,主机系统可以选择强制执行以下限制:如果在由类型名称加扩展名(如
.java
.jav
)组成的文件中未找到类型,则该类型为编译时错误,前提是以下任一情况为真:

  • 该类型由声明该类型的包的其他编译单元中的代码引用

  • 该类型被声明为
    public
    (因此可以从其他包中的代码访问)

此限制意味着每个编译单元最多必须有一个这样的类型。这个限制使得Java编译器很容易在包中找到命名类。在实践中,许多程序员选择将每个类或接口类型放在自己的编译单元中,不管它是公共的还是被其他编译单元中的代码引用的

因此,正如您所看到的,这并不是您所说的“类名必须始终与文件名相同”的要求

这只是一种允许某些编译器在编译期间轻松找到类源代码的方法

但是,更重要的是,它还帮助人类找到源代码。如果您看到类
com.example.Foo
,您就知道在哪里可以找到它,因为它将位于文件
com/example/Foo.java

从技术上讲,非公共(包私有)顶级类可以放在任何名称的文件中,多个此类类可以捆绑在一个文件中,但这使得它们很难找到。出于这个原因,我看到了一条指导原则(不记得在哪里),它说您应该始终将顶级类放在它们自己的文件中,只有一个例外:

  • 如果非公共类仅由另一个类使用,则可以将其放置在与另一个类相同的编译单元(.java文件)中

基本上,这意味着你应该考虑任何名字不是文件名的顶级类,即使它在技术上是包范围的,也应该是“文件范围”。

你应该尝试它,编译它,看看.class文件是如何创建的。问题是关于约定。您可以根据需要选择。约定是公开一个,并确保文件名匹配。合理的约定是使用两个不同的文件,因为否则很难找到您的类。IMHO如果第二个类只在同一个.java文件中使用,那么它只能放在该文件中。@Benedictus:-您应该始终遵循最佳实践,最佳实践是将每个类放在其自己的源文件中,而不管其可见性如何,非公共类除外。这使得其他想要通过浏览文件夹和查找特定文件名来检查类声明的人非常方便。问题与我应该如何编写类无关,而是如何解析它们。@Benedictus:-你在寻找约定,这就是我们所遵循的。@Benedictus:-你可能会发现这很有趣: