一尘不染

为什么在这种情况下会生成classname $ 1.class?

java

我编写了以下代码来实现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。这没有道理。那么,为什么以及如何呢?


阅读 370

收藏
2020-12-03

共1个答案

一尘不染

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

您可以使用javap -c Test(和javap -c Test\$1,和javap -c Test\$TestHolder)查看代码。实际上,它非常聪明!

2020-12-03