Java 为什么我可以用静态内部类的私有构造函数实例化外部类?
调用getInstance()方法时,将实例化Singleton类的实例。我想知道为什么我可以从静态内部类实例化外部类Java 为什么我可以用静态内部类的私有构造函数实例化外部类?,java,Java,调用getInstance()方法时,将实例化Singleton类的实例。我想知道为什么我可以从静态内部类实例化外部类 public class Singleton{ private Singleton(){} private static class SingletonHolder{ private static Singleton INSTANCE = new Singleton(); } public static Singleton getInst
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”(反模式)的实例。单持有者反模式几乎总是适得其反——类被延迟加载,这只会增加更多的工作和混乱。最重要的是,对全球国家说不就行了。