28

我编写了以下代码来实现单例模式:

public final class Test {
     static final class TestHolder {
         private static final Test INSTANCE = new Test();
     }     

     private Test() {}

     public static Test getInstance() {
         return TestHolder.INSTANCE;
     }
}

当我编译这个文件时,它应该会生成Test.class 和Test$TestHolder.class,但它也会生成Test$1.class。这没有意义。那么为什么会这样呢?

4

1 回答 1

29

TestHolder需要调用中的私有构造函数Test。但它是私有的,实际上不能从另一个类中调用。所以编译器玩了一个把戏。它添加了一个只有它知道的新的非私有构造函数!Test该构造函数采用这个匿名类的(未使用的)实例Test$1——没有人知道它的存在。然后TestHolder创建一个实例Test$1并调用构造函数,它是可访问的(它是默认保护的。)

您可以使用javap -c Test(and javap -c Test\$1, and javap -c Test\$TestHolder) 查看代码。其实挺聪明的!

于 2013-06-09T05:06:17.590 回答