Java 为什么我可以用静态内部类的私有构造函数实例化外部类?

Java 为什么我可以用静态内部类的私有构造函数实例化外部类?,java,Java,调用getInstance()方法时,将实例化Singleton类的实例。我想知道为什么我可以从静态内部类实例化外部类 public class Singleton{ private Singleton(){} private static class SingletonHolder{ private static Singleton INSTANCE = new Singleton(); } public static Singleton getInst

调用getInstance()方法时,将实例化Singleton类的实例。我想知道为什么我可以从静态内部类实例化外部类

public class Singleton{
   private Singleton(){}

   private static class SingletonHolder{
      private static Singleton INSTANCE = new Singleton();
   }

   public static Singleton getInstance(){
      return SingletonHolder.INSTANCE;
   }
}

否则,该成员或构造函数被声明为私有,并且只有当且仅当它发生在包含该成员或构造函数声明的顶级类型(§7.6)的主体内时,才允许访问

您的访问发生在包含私有构造函数声明的顶级类型的主体中,因此允许访问


因此,虽然您所拥有的是允许的,但这不会是:

public class Singleton{
   private Singleton(){}
   // ..
}

// Second top-level class in same file.
class Foo {
  Singleton s = new Singleton();
}

因为
private
表示只在这个类中,而内部类在外部类中。这是否回答了您的问题?(在这个外部类中,有一些奇怪的边缘情况,但是如果你做了一些肮脏的事情,它们就是边缘情况。我忘了它们是什么。)另外,我可以创建一个“singleton”(反模式)的实例。单持有者反模式几乎总是适得其反——类被延迟加载,这只会增加更多的工作和混乱。最重要的是,对全球国家说不就行了。