根据JLS,在一个文件中包含多个类是有效的语法,只要文件中只有一个类是公共的。据我了解,这通常是允许仅在单个文件中引用的小类在该文件中维护。
我不确定的一个方面是,如果同一个软件包中的其他文件能够安全地引用原始文件中的第二个类 - 通过范围规则它似乎是有效的,但我不确定它是否有效编译时出了问题。我已经看到它的工作频繁,但我也被项目的其他开发人员告知,在系统的其他地方进行更改之后偶尔会出现构建问题,找到有问题的符号。这种设置是否引用嵌入在其他类'文件中的包私有类,将一些排序编译顺序依赖引入到使构建变得脆弱的进程中?
答案 0 :(得分:3)
是的,这应该是绝对正常的 - 除非你有一个配置不当的构建系统,基本上。你可能应该一次编译同一个包的所有源代码。
我可以看到它可能导致某些构建系统出现问题,这些构建系统试图找出需要重新编译的内容 - 如果它们假设源文件的名称与结果类的名称匹配,则它们可能会在这里混淆(即使你在同一个文件中没有多个类)但这是一个工具问题,而不是语言问题。
请注意,通常如果我有“仅在单个文件中引用的小类”,我通常会将它们设为私有静态嵌套类:
public class OuterClass
{
// Normal code...
// Only used within OuterClass
private static class Foo
{
}
}
这比使用包私有访问更清晰(IMO),如果它真的只是用于单个类。