私有构造的Singleton类可内部实例化?跨类访问才触发限制?
私有构造单例类的访问权限说明
为什么Singleton类的main方法能创建实例?
私有构造方法的访问范围是当前类的内部,包括类中的静态方法(比如main)、实例方法。所以在Singleton自己的main里调用new Singleton()是完全合法的,这是Java访问控制规则的正常表现,并非编译错误。单例限制何时生效?
单例设计的核心是阻止外部类创建多个实例。只有当其他类(非Singleton类本身)尝试直接调用new Singleton()时,编译器才会报错——因为私有构造对外部类不可见。此时必须通过单例类提供的getInstance()(或类似方法)获取唯一实例,单例的限制才会体现出来。
举个代码示例:
public class Singleton { private static final Singleton INSTANCE = new Singleton(); // 私有构造方法 private Singleton() {} public static Singleton getInstance() { return INSTANCE; } public static void main(String[] args) { // 类内部可直接调用私有构造,生成新实例 Singleton s3 = new Singleton(); // 输出false,说明s3和单例INSTANCE不是同一个对象 System.out.println(s3 == INSTANCE); } } // 外部测试类 class SingletonTest { public static void main(String[] args) { // 以下代码会编译报错:构造方法Singleton()是私有,无法访问 // Singleton s = new Singleton(); // 正确方式:通过getInstance获取单例 Singleton s = Singleton.getInstance(); } }
总结:单例的约束对象是外部类,而非类自身。类内部代码不受私有构造的限制,所以在自身main方法中创建实例是允许的,这完全符合语言规则。
内容的提问来源于stack exchange,提问作者gourav pal
相关产品推荐
相关产品推荐

