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 就可以了。
私有
将您从上述问题中解救出来。如果需要,您可以更好地控制更改实例。
我一直在思考这些代码片段之间的区别。我知道如果您使用 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 就可以了。
私有
将您从上述问题中解救出来。如果需要,您可以更好地控制更改实例。