在 Java 中,您可以在单个文件中定义多个顶级类,前提是其中最多有一个是公共的(请参阅JLS §7.6 http://docs.oracle.com/javase/specs/jls/se8/html/jls-7.html#jls-7.6)。参见下面的例子。
这种技术有一个简洁的名称吗(类似于inner
, nested
, anonymous
)?
JLS表示系统may强制执行这些次要类不能的限制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;
}
Javac并没有主动禁止这一点,但它确实有一个限制,这几乎意味着您永远不想引用另一个文件中的顶级类,除非它与它所在的文件具有相同的名称。
假设你有两个文件,Foo.java
and Bar.java
.
Foo.java
包含:
Bar.java
包含:
public class Bar
class Baz
我们还假设所有类都位于同一个包中(并且文件位于同一目录中)。
如果发生什么情况Foo
指的是Baz
但不是Bar
我们尝试编译Foo.java
?编译失败并出现如下错误:
Foo.java:2: cannot find symbol
symbol : class Baz
location: class Foo
private Baz baz;
^
1 error
如果你仔细想想,这是有道理的。如果Foo
指的是Baz
,但是没有Baz.java
(or Baz.class
), 怎么能javac知道要查看什么源文件吗?
如果你改为告诉javac编译Foo.java
and Bar.java
同时,或者如果您之前已经编译过Bar.java
(离开Baz.class
where javac可以找到它),或者即使Foo
恰好指的是Bar
此外Baz
,然后这个错误就消失了。然而,这会让您的构建过程感觉非常不可靠且不稳定。
因为实际的限制更像是“不要引用另一个文件中的顶级类,除非它与其所在的文件具有相同的名称,或者您还引用了另一个与该文件也在该文件中”有点难以理解,人们通常采用更直接(尽管更严格)的约定,即在每个文件中放置一个顶级类。如果您改变了关于某个类是否应该公开的想法,这也会更好。
较新版本的javac在这种情况下也可以产生警告-Xlint:all
:
auxiliary class Baz in ./Bar.java should not be accessed from outside its own source file
有时,每个人以特定方式做某事确实有充分的理由。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)