静态类vs单例类

时间:2011-05-23 03:48:52

标签: java singleton

我知道这个话题已被一遍又一遍地讨论和杀死,但我仍有一个疑问,我希望有人可以帮助我或指导我在SO上预先存在的帖子。

在传统的C中,静态变量存储在数据段中,局部变量存储在堆栈中。与局部变量相比,我认为这会使静态变量的存储和维护成本更高。正确?

当试图理解Java或C#时,与单例类相比,静态类是否会有利?由于整个类在类初始化之前被加载到内存中,所以除非我们有小的内联函数,否则我看不出它有什么优势。

我喜欢Singleton课程,并且不愿意看到它成为一种反模式,我仍然在寻找它带来的所有优势......然后松散于其他人的线程安全论证。

-Ivar

4 个答案:

答案 0 :(得分:7)

与C不同,Java类定义中的static关键字仅仅意味着,这只是一个普通的类,就像任何其他类一样,但它恰好在另一个类中声明以组织代码< / em>的。换句话说,以下两种声明方式之间没有任何行为差异*:
一个)

class SomeOtherClass {
    static class Me {
        // If you "upgrade" me to a top-level class....
    }
}

b)中

class Me {
    // I won't behave any different....
}

当第一次使用类时,类定义被加载到内存中,对于“静态”和“非静态”类都是如此。内存的使用方式也没有区别。在较旧的JVM中,对象始终存储在堆中。现代JVM 在可能和有益的情况下在堆栈上分配对象,但这种优化对于编码器是透明的(不可能通过代码影响这种行为),并使用{{1} } keyword对此行为没有任何影响。

现在,回到你原来的问题,正如我们所看到的,我们真的无法比较Java中的静态类和Singleton,因为它们在Java中是完全不同的概念(我也不知道如何静态类与Singleton相比,但我会在这个答案中关注Java)。 Java中的static关键字是重载的,具有很多含义,因此可能会令人困惑。

static会自动成为“反模式”吗?我不这么认为。 Singleton的滥用,但Singleton模式本身可以有很多好的用途。它恰好被滥用了很多。如果您有正当理由使用Singleton模式,则使用它没有任何问题。


<小时/> *注意:为什么要写Singleton,你可能会问。事实证明,“非静态”嵌套类有其自身有些复杂的内存管理含义,除非你有充分的理由,否则通常不鼓励使用它(请参阅其他问题以获取更多信息)。

static

答案 1 :(得分:3)

Singleton类本质上是一个带有private构造函数的常规顶级类,以保证其单一性。 Singleton类本身提供了一种获取其实例的方法。单例类不是很容易测试,因此我们倾向于坚持Just Create Once的想法。

static类本质上是一个嵌套类。嵌套类本质上是一个外层类,它嵌套在另一个类中,只是为了方便打包。至少在Java中,顶级类不能声明为static - 您应该自己尝试。

  

这对静态是不利的   与单身人士相比时的课程   类?

根据上述解释,你的这个问题现在变得有些无效了。此外,static类(当然是嵌套的)也可以是单例。

进一步阅读:

答案 2 :(得分:0)

一个与另一个之间的区别在于内存管理,如果你的应用程序必须实例化很多东西,那会烧掉内存就像魅力变成了内存问题,性能和其他东西...... 这可能会有所帮助......

http://butunclebob.com/ArticleS.UncleBob.SingletonVsJustCreateOne http://www.objectmentor.com/resources/articles/SingletonAndMonostate.pdf

答案 3 :(得分:0)