将源文件限制为单个顶级类

将源文件限制为单个顶级类

虽然Java编译器能让你在一个源文件里定义多个顶级类,但这种操作风险比较大,因为使用哪个定义将会受到源文件传递给编译器的顺序的影响。

举个例子,考虑下面这个源文件,它只包含了一个Main类,这个类指向了另外两个顶级类(Utensil和Dessert)的成员:

1
2
3
4
5
public class Main {
public static void main(String[] args) {
System.out.println(Utensil.NAME + Dessert.NAME);
}
}

假设在一个叫Utensil.java的源文件里:

1
2
3
4
5
6
class Utensil {
static final String NAME = "pan";
}
class Dessert {
static final String NAME = "cake";
}

当然主程序会打印:pancake。

但如果存在另一个叫Dessert.java的源文件里定义了两个相同的类:

1
2
3
4
5
6
7
// Two classes defined in one file. Don't ever do this!
class Utensil {
static final String NAME = "pot";
}
class Dessert {
static final String NAME = "pie";
}

在这个情况,如果编译时使用的命令为javac Main.java Dessert.java,会编译失败,因为编译器发现了重复定义。

如果你用命令“javac Main.java”“javac Main.java Utensil.java”来编译程序,它的行为将与你写Dessert.java文件之前的行为一样,打印出“pancake”。

但如果用命令“javac Dessert.java Main.java”来编译程序,它将会打印出“potpie”。

这种依赖于编译顺序的代码风格不是我们想要的,因此解决方法就是,永远不要将多个顶级类或者接口放到一个源文件里。