在Java中获取实例的好处

时间:2014-12-07 08:35:03

标签: java

我看过这段代码有两种不同的写法

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();

之间有什么区别

两者都有好处吗?

5 个答案:

答案 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应该已大写)。事件为instanceTester, 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。由于publicnull,因此任何知道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评论以了解何时有实例,何时没有。