You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

私有构造的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 21:02:05