我看过这段代码有两种不同的写法
public static void main(String[] args) {
Tester.boot();
new tester();
测试员类:
public static tester instance;
public static void boot() {
if (instance == null)
instance = new tester();
}
public Tester() {
System.out.println("test made");
}
tester.boot();
和new tester();
两者都有好处吗?
答案 0 :(得分:2)
这里显示了三个概念:
测试员类:
if (instance == null)
instance = new tester();
当您希望控制对象的构造时使用。变量instance
控制new Tester()
是否调用boot()
。
这可用于实施Lazy Initialization。这是在需要之前延迟物体构造的做法。它通常在建筑既昂贵又不总是需要时使用。在这里,它被推迟到boot()
被调用。延迟初始化不仅用于单例。 Some认为在java中使用Lazy Initialization来创建singleton
实际上是错误的,因为类加载器的工作方式。他们声称这是一种从c ++移植过来的习惯。作为一种模式,单身人士一直存在争议, some call it an anti pattern 。
测试员类:
public static tester instance;
boot()
,构造一个Tester
对象,将instance
设置为该对象(注意:tester
应该已大写)。事件为instance
,Tester, resides in the
Tester class means that
Tester is [**self referential**][7], like the nodes in a linked list. But, unlike nodes, because
实例is
静态, all
测试人员objects have the same copy of
实例。
因为引导永远不会将它构造的内容放在instance
的任何位置,所以任何时候只有boot()
个Tester
构造的instance
对象存在,只要public
永远不存在复制到任它很容易,因为它是instance
。
只要null
永远不会被设置回boot()
Tester
,无论被调用多少次,都只会构建一次instance
。由于public
为null
,因此任何知道Tester
的内容都可以将boot()
设置为Tester
。这样做会允许Tester
再次构造,旧的private
对象将被遗忘(垃圾收集)。
由于Tester
的构造函数尚未生成boot()
,因此Tester
永远不会由instance
之外的其他内容构建Tester
。这意味着仍然可以运行许多{{1}}个对象。但是他们都有一个{{1}},其中可能是也可能不是。
经典单例将具有Lazy Initialization,是自引用的,并且以这样的方式封装,即最多只存在一个{{1}}对象。然而,这里没有任何证据证明这首先是一个单身人士。这可能是一个非常错误的建筑优化。
答案 1 :(得分:1)
这是Java中SINGLETON模式的一种实现。 在这里了解这种模式背后的概念click here.
很快,如果您希望通过所有应用程序的生命周期拥有类实例的实例,则需要使用此模式。
要理解它,代码中的键位于“if(instance == null)” {instance应该用较低的键写入,因为它应该是一个类可变}。
如果您只使用“new ...”,则可以创建此变量的任何nuber实例。 如果您使用 boot 方法,则可以确保实例始终相同。
无论如何,在实施中你已经写了一些东西。
你应该参考这个link,其中还有一个完整的Java编程语言实现。
答案 2 :(得分:0)
boot
没用,你还没有展示如何使用Instance
。但我认为它实现了singleton,这意味着确保只创建了一个类的实例。我不认为它是一个很好的实现,因为Instance
可以被错误地使用而不被初始化。
当您撰写new tester()
时,您正在创建tester
对象的新实例。
请按照Java Naming Convention并相应地重命名您的变量。
答案 3 :(得分:0)
具体 - 如果你使用tester.boot()它会设置" instance"如果你直接调用构造函数,它就不会。
这是单例模式的一个非常破碎的版本,为了正确地执行它,构造函数应该是私有的,这使得新的Tester()不可能。
此外,启动方法看起来应该更像:
public synchronized static Tester boot()
{
if(instance == null) {
instance=new Tester();
}
return instance;
}
甚至那可能是不确定的。
答案 4 :(得分:0)
阅读this评论以了解何时有实例,何时没有。