Java 为什么我们要在单个文件中声明公共类?

Java 为什么我们要在单个文件中声明公共类?,java,jakarta-ee,Java,Jakarta Ee,我是Java编程新手,我创建了一个名为Demo的类,在编译这个Java程序时另存为sample.Java,编译错误如下 public class Demo { public static void main(String[] args) { System.out.println("This is year"); } } sample.java:3:class Demo是公共的,应该在名为Demo.jav

我是Java编程新手,我创建了一个名为Demo的类,在编译这个Java程序时另存为sample.Java,编译错误如下

  public class Demo {
        public static void main(String[] args) {
        System.out.println("This is year");
                }
            }
sample.java:3:class Demo是公共的,应该在名为Demo.java的文件中声明

为什么我们要在单个文件中声明公共类

谢谢


Mukthyar

因为这是Java规范所要求的(或者至少,它允许实现需要这一点;请参见下面的Jon评论)


至于“为什么”,我只能假设。但是很明显,Java的设计者非常热衷于明确的编码约定,等等。每个源文件一个公共类意味着在哪里可以找到一些东西并不含糊


(如果有技术上的原因,我不知道。)

因为这正是Java规范所要求的(或者至少,它允许实现需要这一点;请参见下面Jon的评论)


至于“为什么”,我只能假设。但是很明显,Java的设计者非常热衷于明确的编码约定,等等。每个源文件一个公共类意味着在哪里可以找到一些东西并不含糊


(如果有技术原因,我不知道。)

TL;DR:降低软件的概念复杂性

如果有许多公共类隐藏在具有不相关名称的文件中,那么仅通过查看包结构就很难看到程序的概念结构


@因为java规范这么说——我认为真正的问题是规范背后的推理;DR:降低软件的概念复杂性

如果有许多公共类隐藏在具有不相关名称的文件中,那么仅通过查看包结构就很难看到程序的概念结构


@因为java规范是这样说的——我认为真正的问题是规范背后的推理,它是为了防止人们在非正交命名的文件中使用数百个类来混乱文件。namespacepart/namespacepart/namespacepart/classname结构是为了提供一个标准的、可持续的结构。

它是为了防止人们在非正交命名的文件中使用数百个类来混乱文件。namespacepart/namespacepart/namespacepart/classname结构提供了一个标准的、可持续的结构。

@Oli Charlesworth是对的:这是Java语言规范所要求的。你可能会问他们为什么需要这个?可能的答案是把事情弄清楚。类定义为原子单位。您可以用它的另一个版本替换这个类,如果公共接口没有更改,一切都将继续工作

因此,Java语言设计者决定强制我们将每个类存储在单独的文件中

他们只是对非公共课程做了一些例外。几个非公共类可以保存在一个文件中。我认为原因在于非公共类是实现的一种血淋淋的细节,作者可以随时更改它。由于类是非公共的,所以这些更改不应影响任何API用户


但我强烈建议您将每个类(即使不是公共类)保存在单独的文件中。这提高了代码的可读性,最终提高了代码的质量

@olicharlesworth是对的:这是Java语言规范所要求的。你可能会问他们为什么需要这个?可能的答案是把事情弄清楚。类定义为原子单位。您可以用它的另一个版本替换这个类,如果公共接口没有更改,一切都将继续工作

因此,Java语言设计者决定强制我们将每个类存储在单独的文件中

他们只是对非公共课程做了一些例外。几个非公共类可以保存在一个文件中。我认为原因在于非公共类是实现的一种血淋淋的细节,作者可以随时更改它。由于类是非公共的,所以这些更改不应影响任何API用户


但我强烈建议您将每个类(即使不是公共类)保存在单独的文件中。这提高了代码的可读性,最终提高了代码的质量

那么,类中提到的默认值(无说明符)又如何呢?类中提到的默认值(无说明符)又如何呢?好吧,这是Java规范允许特定实现需要的,而且大多数实现都使用了该要求。我不确定这个答案是否真的回答了“为什么”这个问题。这告诉我它是必需的,但不是为什么它应该是必需的。@LouisWasserman:这个问题类似于“为什么包是默认的可访问性?”;答案是因为语言是这么说的。(我想我想回答“为什么语言会这么说。”)好吧,这是Java规范允许特定实现需要的——而且大多数实现都使用了这个要求。我不确定这个答案是否真的回答了“为什么”的问题。这告诉我它是必需的,但不是为什么它应该是必需的。@LouisWasserman:这个问题类似于“为什么包是默认的可访问性?”;答案是因为语言这么说。(我想我想回答“为什么语言这么说。”)实际上,每个编译单元一个公共类的限制是为了避免编译器必须额外通过所有编译单元,以确定哪些类在哪里。它是对Oak(Java在成为Java之前被称为Java)的保留,尽管它对于当前的编译器来说仍然是有意义的。在现实中,每个编译单元一个公共类的限制是为了避免编译器必须额外通过所有编译单元,以确定哪些类在哪里。这是橡树留下的(什么爪哇哇