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

解析getInstance()方法工作原理:为何无需使用new关键字

为什么单例模式获取实例无需直接使用new关键字?

先看你提供的单例模式代码:

public class SingletonExample {
    private static SingletonExample instance;

    private SingletonExample() {
        // Private constructor
        System.out.println("SingletonExample instance created.");
    }

    public static SingletonExample getInstance() {
        if (instance == null) {
            instance = new SingletonExample();
        }
        return instance;
    }

    public void displayMessage() {
        System.out.println("Hello from SingletonExample!");
    }

    public static void main(String[] args) {
        // This won't work : SingletonExample instance = new SingletonExample();

        // Getting an instance of SingletonExample using getInstance() method
       SingletonExample singleton = SingletonExample.getInstance();
        singleton.displayMessage();
        
    }
}

你并没有真正省略new关键字

你在调用getInstance()时不用写new,只是因为new被封装在方法内部了,不是真的不需要new来创建对象。

为什么外部调用不能直接用new?

这个类把构造方法SingletonExample()设为了private,这意味着除了类自身内部,其他任何代码都不能通过new SingletonExample()来创建实例。这是单例模式的核心设计:强制所有外部代码只能通过类提供的入口获取实例,以此保证整个程序生命周期内只会有一个该类的实例。

getInstance()创建实例的实际机制

  1. 类内部维护了一个静态变量instance,用来存储唯一的实例对象。
  2. 当第一次调用getInstance()时,方法会检查instance是否为null:
    • 如果是null,就执行instance = new SingletonExample()——这里就是用new关键字创建了实例,然后把它赋值给静态变量保存。
  3. 后续再调用getInstance()时,instance已经不为null,方法会直接返回这个已经创建好的实例,不会再执行new操作。

简单说,这个模式只是把new的操作从外部调用代码转移到了类内部的静态方法里,既保证了实例的唯一性,又给外部提供了安全的获取入口。

注意:你这个实现是线程不安全的——如果多个线程同时调用getInstance(),可能会创建多个实例。如果需要线程安全的单例,还需要额外的同步处理。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:59:53