Java类命名规则

问题描述 投票:0回答:2

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

interface Foo {}

class Bar{}

有些人似乎对这个问题很困惑

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

为什么我不随心所欲地命名它呢?因为我实际上正在编写一个重构代码的应用程序,每当它重命名类时,我需要知道如何以及何时更改我的文件名。

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

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

java naming-conventions
2个回答
8
投票

引用 Java 语言规范,第 7.6 节 顶级类型声明 :

当且仅当包存储在文件系统中(第 7.2 节)时,主机系统可以选择强制实施这样的限制:如果在由以下组成的名称的文件中找不到类型,则这是一个编译时错误如果满足以下任一条件,则类型名称加上扩展名(例如

.java
.jav
):

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

  • 该类型已声明

    public
    (因此可以从其他包中的代码访问)。

此限制意味着每个编译单元最多只能有一个此类类型。此限制使 Java 编译器可以轻松地在包中查找命名类。在实践中,许多程序员选择将每个类或接口类型放在自己的编译单元中,无论它是公共的还是被其他编译单元中的代码引用。

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

这只是一种允许 some 编译器在编译期间找到类源代码的简单方法。

但是,更重要的是,它还可以帮助人类找到源代码。如果您看到对类

com.example.Foo
的引用,您就知道在哪里可以找到它,因为它将位于文件
com/example/Foo.java
中。

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

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

基本上,这意味着您应该将任何名称不是文件名的顶级类视为“文件范围”,即使它在技术上是包范围的。


2
投票

有 2 条规则需要遵循:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.