将源文件限制为单个顶级类
虽然Java编译器能让你在一个源文件里定义多个顶级类,但这种操作风险比较大,因为使用哪个定义将会受到源文件传递给编译器的顺序的影响。
举个例子,考虑下面这个源文件,它只包含了一个Main类,这个类指向了另外两个顶级类(Utensil和Dessert)的成员:
1 | public class Main { |
假设在一个叫Utensil.java的源文件里:
1 | class Utensil { |
当然主程序会打印:pancake。
但如果存在另一个叫Dessert.java的源文件里定义了两个相同的类:
1 | // Two classes defined in one file. Don't ever do this! |
在这个情况,如果编译时使用的命令为javac Main.java Dessert.java,会编译失败,因为编译器发现了重复定义。
如果你用命令“javac Main.java”或“javac Main.java Utensil.java”来编译程序,它的行为将与你写Dessert.java文件之前的行为一样,打印出“pancake”。
但如果用命令“javac Dessert.java Main.java”来编译程序,它将会打印出“potpie”。
这种依赖于编译顺序的代码风格不是我们想要的,因此解决方法就是,永远不要将多个顶级类或者接口放到一个源文件里。