【问题标题】:Java static instance VS get-methodJava 静态实例 VS 获取方法
【发布时间】:2020-02-28 21:52:03
【问题描述】:

我一直在思考这些代码sn-ps的区别。我了解如果您使用 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:哪一个,为什么?有什么区别?

谢谢! :)

【问题讨论】:

  • 你测试过你的代码吗?上面的代码 sn-p 是 instance = this 的语法错误;因为“this”在静态上下文中不存在。
  • 已修复!感谢您的关注,一会就写好了。

标签: java static singleton instance


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    可扩展性

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

    【讨论】:

      【解决方案3】:

      公开

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

      私人

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-12
        • 1970-01-01
        • 1970-01-01
        • 2018-02-18
        • 2014-02-19
        • 1970-01-01
        • 1970-01-01
        • 2012-12-30
        相关资源
        最近更新 更多