Java:一个文件中的多个类声明

新手上路,请多包涵

在 Java 中,您可以在单个文件中定义多个顶级类,前提是其中至多有一个是公共的(参见 JLS §7.6 )。例如,请参见下文。

  1. 这种技术是否有一个简洁的名称(类似于 innernestedanonymous )?

  2. JLS 表示系统 可能会 强制执行这些次要类不能是 referred to by code in other compilation units of the package 的限制,例如,它们不能被视为包私有的。这真的会在 Java 实现之间发生变化吗?

例如,PublicClass.java:

 package com.example.multiple;

public class PublicClass {
    PrivateImpl impl = new PrivateImpl();
}

class PrivateImpl {
    int implementationData;
}

原文由 Michael Brewer-Davis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 909
2 个回答

我建议将这种技术(包括单个源文件中的多个顶级类)命名为“mess”。说真的,我不认为这是个好主意——在这种情况下我会使用嵌套类型。然后预测它在哪个源文件中仍然很容易。不过我不认为这种方法有官方术语。

至于这是否真的在实现之间发生了变化——我非常怀疑,但如果你一开始就避免这样做,你就永远不需要关心 :)

原文由 Jon Skeet 发布,翻译遵循 CC BY-SA 3.0 许可协议

Javac 并没有主动禁止这一点,但它确实有一个限制,这几乎意味着你永远不想从另一个文件中引用顶级类,除非它与它所在的文件同名。

假设您有两个文件 Foo.javaBar.java

Foo.java 包含:

  • public class Foo

Bar.java 包含:

  • public class Bar
  • class Baz

我们还假设所有类都在同一个包中(并且文件在同一个目录中)。

如果---- Bar Foo 提到 Baz Foo.java 编译失败并出现如下错误:

 Foo.java:2: cannot find symbol
symbol  : class Baz
location: class Foo
  private Baz baz;
          ^
1 error

如果您考虑一下,这是有道理的。 If Foo refers to Baz , but there is no Baz.java (or Baz.class ), how can javac know what source file to look in ?

If you instead tell javac to compile Foo.java and Bar.java at the same time, or if you had previously compiled Bar.java (leaving the Baz.classjavac 可以找到它的地方),或者即使 Foo Bar 之外恰好引用 Baz ,这个错误也会消失。然而,这会让您的构建过程感觉非常不可靠和不稳定。

因为实际的限制,更像是“不要从另一个文件中引用顶级类,除非它与它所在的文件同名,或者你还引用另一个与名称相同的类那个文件也在那个文件中”有点难以遵循,人们通常会采用更直接(尽管更严格)的约定,即在每个文件中放置一个顶级类。如果您改变了某个类是否应该公开的想法,这也会更好。

在这种情况下,较新版本的 javac 也可以使用 -Xlint:all 产生警告:

 auxiliary class Baz in ./Bar.java should not be accessed from outside its own source file

有时每个人都以特定方式做某事确实有充分的理由。

原文由 Laurence Gonsalves 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题