效益

2014-12-07 68 views
0

我已经看到了这个代码,有两种不同的方式书面效益

public static void main(String[] args) { 
    Tester.boot(); 
    new tester(); 

Tester类:

public static tester instance; 

public static void boot() { 

    if (instance == null) 
     instance = new tester(); 
} 

public Tester() { 
    System.out.println("test made"); 
} 

是什么beetween tester.boot();new tester();

的区别

两者都有好处吗?

+0

仅用于创建对象实例的方法(除构造函数外)或对象称为*工厂*。 – Raedwald 2014-12-07 08:38:46

+0

您应该发布编译成功的简短代码示例。 – PeterMmm 2014-12-07 08:41:31

回答

2

这里有正在显示三个概念:

Tester类:

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

Tester类:

public static tester instance; 

boot(),构建了一个Tester对象,设置instance到该对象(注:tester应该是大写)。 instance,其类型为Tester, resides in the测试仪class means that测试仪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是从来没有设置回nullboot()将构造一个Tester只有一次,不管它是如何调用的次数。由于instancepublic它可以随时通过知道Tester的任何事情设置为null。这样做会允许boot()再次构建,旧的Tester对象将被遗忘(垃圾收集)。

由于Tester小号构造尚未取得private没有说Tester永远不会被比boot()其他东西构成担保。这意味着仍可能有许多Tester对象在运行。但他们都有一个instance在他们可能会或可能不是他们自己。

一个典型的单例会有延迟初始化,是自引用的,并且被封装在最多只有一个Tester对象永远存在的地方。然而,这里没有什么证明这本来就是一个单身人士。这可能是一个建设优化失去了可怕的错误。

0

boot没用,你没有显示如何使用Instance。但我认为它的实现是singleton,这意味着确保只创建一个类的实例。我不认为这是一个很好的实现,因为Instance可以被错误地使用而不被初始化。

当您编写new tester()时,则会创建一个新的实例tester对象。

请按照Java Naming Convention并相应地重命名您的变量。

1

这是用Java实现的一种SINGLETON模式。 看这里了解这种模式click here.

不久,你想用这个模式背后的概念,如果你想拥有类实例槽的所有应用程序的生命周期中的一个实例。

要理解它,在你的代码的关键是在部分“如果(例如== NULL)”{实例应该与下级密钥写的,因为它应该是一个类变量}。

如果你只是简单地使用“new ...”,可以创建这个变量的任何实例的nuber。 如果您使用引导方法,您确定该实例始终相同。

无论如何,在执行过程中你已经写了一些东西丢失。

您应该参考此link,其中还有一个Java编程语言的完整实现。

0

具体说明 - 如果使用tester.boot(),它会正确设置“实例”,如果直接调用构造函数,则不会。

这是一个真正的单例模式的破碎版本,要正确地做到这一点,构造函数应该是私有的,这使得新的Tester()不可能。

此外,引导方法应该看起来有点更像:

public synchronized static Tester boot() 
{ 
    if(instance == null) { 
     instance=new Tester(); 
    } 
    return instance; 
} 

甚至认为可能是前途未卜。

0

阅读this评论以了解什么时候有实例,何时没有实际意义。