Java静态实例VS get方法

Java静态实例VS get方法,java,static,singleton,instance,Java,Static,Singleton,Instance,我一直在思考这些代码片段之间的区别。我知道如果您使用getInstance(下面的第二个选项),您不能设置实例字段,但还有其他区别吗 public class MainClass { public static MainClass instance; public static void main(String[] args) { instance = new MainClass(); } public void HelloWorld() {

我一直在思考这些代码片段之间的区别。我知道如果您使用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

使用“MainClass.instance.HelloWorld();”(第一个)和“MainClass.getInstance().HelloWorld();”(第二个)之间有什么区别

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


谢谢!:)

可扩展性


不同之处在于,如果您的程序对实例有许多调用,并且您希望在检索实例时更改实例的来源或执行其他操作,则可以修改
getInstance()
方法,在第一个示例中,您没有在使用
实例的每个位置添加代码,而是将
实例
声明为
公共
,使其容易受到意外更改的影响,因此不建议使用


在第二个示例中,您已将
实例
声明为
私有
,使其在类外不可见,从而确保如果需要,它只能通过
公共
变异器/设置器进行更改,您可以将所需的逻辑以您希望的方式进行更改。

公共

当前代码易受外部人员攻击,他们可以使用新实例更改您的实例,甚至通过子类化更改自己的实例。若你们并没有必要在第一次初始化后更改实例,那个么将其设置为最终的,然后公开是好的

私人


使您免于上述问题。如果需要,为您提供更多更改实例的控制

你测试过你的代码吗?上面的代码段是instance=this上的语法错误;因为“this”不存在于静态上下文中。已修复!谢谢你的注意,马上就写下来。
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!");
    }
}