getInstance()方法是如何工作的以及为什么不使用new关键字?

问题描述 投票:0回答:1

我注意到创建实例的引用时没有使用

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 关键字以及如何使用
getInstance()
方法实际创建实例。

有人可以提供有关

getInstance()
方法在这种情况下如何工作以及为什么不使用
new
关键字的见解吗?

java design-patterns tags instantiation
1个回答
2
投票

getInstance()
实际上返回先前创建并保存到变量的实例,该变量是使用
new
运算符的类实例。

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

实例化一个类

new 运算符通过为新对象分配内存并返回对该内存的引用来实例化一个类。 new 运算符还调用对象构造函数。

注意:短语“实例化类”与“创建对象”含义相同。当您创建一个对象时,您正在创建一个类的“实例”,因此“实例化”了一个类。 new 运算符需要一个后缀参数:对构造函数的调用。构造函数的名称提供了要实例化的类的名称。

new 运算符返回对其创建的对象的引用。该引用通常被分配给适当类型的变量,例如:

点 originOne = new Point(23, 94); new 运算符返回的引用不必分配给变量。也可以直接在表达式中使用。例如:

int height = new Rectangle().height; 该声明将在下一节中讨论。

© www.soinside.com 2019 - 2024. All rights reserved.