Java 静态实例 VS 获取方法

Java static instance VS get-method

我一直在思考这些代码片段之间的区别。我知道如果您使用 getInstance(下面的第二个选项),您不能设置实例字段,但是还有其他区别吗?

public class MainClass {
    public static MainClass instance;

    public static void main(String[] args) {
        instance = new MainClass();
    }

    public void HelloWorld() {
        System.out.println("This is a test!");
    }
}

VS

public class MainClass {
    private static MainClass instance;

    public static void main(String[] args) {
        instance = new MainClass();
    }

    public MainClass getInstance() {
        return instance;
    }

    public void HelloWorld() {
        System.out.println("This is a test!");
    }
}

使用"MainClass.instance.HelloWorld();"(第一)或"MainClass.getInstance().HelloWorld();"(第二)有什么区别

TLDR:哪一个,为什么?有什么区别?

谢谢! :)

可扩展性

不同之处在于,如果您的程序多次调用实例,并且您想更改实例的来源或在检索实例时执行其他操作,则可以修改 getInstance() 方法,而不是在每个使用 instance.

的位置添加代码

在第一个示例中,您已将 instance 声明为 public,使其容易受到意外更改的影响,因此不建议这样做。

在第二个示例中,您已将 instance 声明为 private,使其在 class 之外不可见,从而确保如果需要,只能通过 public mutator/setter 您可以在其中放置所需的逻辑,您希望如何更改它。

Public

当前代码容易受到外部人员的攻击,他们可以通过子类化将您的实例更改为新实例,甚至是他们自己的实例。如果您在第一次初始化后不需要更改实例,则将其设为最终状态,然后 public 就可以了。

私有

将您从上述问题中解救出来。如果需要,您可以更好地控制更改实例。