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

虽然 Java 编译器允许在单个源文件中定义多个顶级类,但这样做没有任何好处,并且存在重大风
险。 风险源于在源文件中定义多个顶级类使得为类提供多个定义成为可能。 使用哪个定义会受到源文
件传递给编译器的顺序的影响。

public class Main {
public static void main(String[] args) {
System.out.println(Utensil.NAME + [Dessert.NAME](http://Dessert.NAME));
}
}
/
/ Two classes defined in one file. Don't ever do this!
class Utensil {
static final String NAME = "pan";
} c
lass Dessert {
static final String NAME = "cake";
}

  现在假设你不小心创建了另一个名为 Dessert.java 的源文件,它定义了相同的两个类:

// Two classes defined in one file. Don't ever do this!
class Utensil {
static final String NAME = "pot";
} c
lass Dessert {
static final String NAME = "pie";
}

  如果你足够幸运,使用命令 javac Main.java Dessert.java 编译程序,编译将失败,编译器
会告诉你,你已经多次定义了类 Utensil Dessert 。 这是因为编译器首先编译 Main.java
当它看到对 Utensil 的引用(它在 Dessert 的引用之前)时,它将在 Utensil.java 中查找这
个类并找到 Utensil Dessert 。 当编译器在命令行上遇到 Dessert.java 时,它也将拉入该
文件,导致它遇到 Utensil Dessert 的定义。
如果使用命令 javac Main.java javac Main.java Utensil.java 编译程序,它的行为
与在编写 Dessert.java 文件(即打印 pancake )之前的行为相同。 但是,如果使用命令 javac
Dessert.java Main.java 编译程序 ,它将打印 potpie 。 程序的行为因此受到源文件传递给编译
器的顺序的影响,这显然是不可接受的
解决这个问题很简单,将顶层类(如我们的例子中的 Utensil Dessert )分割成单独的源
文件。 如果试图将多个顶级类放入单个源文件中,请考虑使用静态成员类(详见第 24 条)作为将类拆
分为单独的源文件的替代方法。 如果这些类从属于另一个类,那么将它们变成静态成员类通常是更好的
选择,因为它提高了可读性,并且可以通过声明它们为私有(详见第 15 条)来减少类的可访问性

public class Test {
public static void main(String[] args) {
System.out.println(Utensil.NAME + [Dessert.NAME](http://Dessert.NAME));
} p
rivate static class Utensil {
static final String NAME = "pan";
}
private static class Dessert {
static final String NAME = "cake";
}

  

永远不要将多个顶级类或接口放在一个源文件中。 遵循这个规则保证在编译时不
能有多个定义。 这又保证了编译生成的类文件以及生成的程序的行为与源文件传递给编译器的顺序无
关。

 

猜你喜欢

转载自www.cnblogs.com/lIllIll/p/12758078.html
今日推荐