我编写了以下代码来实现Singleton模式:
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。这没有道理。那么,为什么以及如何呢?
类TestHolder需要在中调用私有构造函数Test。但是它是私有的,实际上不能从另一个类中调用。因此,编译器发挥了作用。它 添加了一个Test仅知道的新的非私有构造函数!_该构造函数采用此匿名类的(未使用的)实例Test$1-没人知道它的存在。然后TestHolder创建的实例Test$1并调用 _该 构造函数,该构造函数是可访问的(默认保护)。
TestHolder
Test
Test$1
您可以使用javap -c Test(和javap -c Test\$1,和javap -c Test\$TestHolder)查看代码。实际上,它非常聪明!
javap -c Test
javap -c Test\$1
javap -c Test\$TestHolder