我知道这个话题已被一遍又一遍地讨论和杀死,但我仍有一个疑问,我希望有人可以帮助我或指导我在SO上预先存在的帖子。
在传统的C中,静态变量存储在数据段中,局部变量存储在堆栈中。与局部变量相比,我认为这会使静态变量的存储和维护成本更高。正确?
当试图理解Java或C#时,与单例类相比,静态类是否会有利?由于整个类在类初始化之前被加载到内存中,所以除非我们有小的内联函数,否则我看不出它有什么优势。
我喜欢Singleton课程,并且不愿意看到它成为一种反模式,我仍然在寻找它带来的所有优势......然后松散于其他人的线程安全论证。
-Ivar
答案 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)