静态类vs单身类
我知道这个话题已经被讨论过并且一遍又一遍地被杀死,但是我仍然有一个疑问,那就是我希望有人能够帮助我,或者引导我到SO上的预先存在的帖子。静态类vs单身类
在传统的C中,静态变量存储在数据段中,局部变量存储在堆栈中。与局部变量相比,我认为会使静态变量存储和维护更加昂贵。对?
当试图从Java或C#方面了解时,与单例类相比,这会对静态类有利吗?由于整个类在类初始化之前被加载到内存中,除非我们有小的内联函数,否则我不会看到它有什么优势。
我爱单身类,并不愿看到它变成一个反模式,我现在还在找工作随之而来......然后松线程安全等参数的所有优点。
-Ivar
由C不同的是,在Java类的static
关键字定义仅仅意味着,这只是一个普通的类,就像任何其他类一样,但它恰好在另一个类中声明来组织代码。换句话说,有声明*下列2路之间没有任何行为差异:
一个)
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 做在栈上分配对象时,这是可能的和有益的,但这种优化是透明的编码器(这是不可能影响通过这个代码的行为),并使用static
关键字不会对此有什么影响行为。
现在,回到你原来的问题,正如我们所看到的,我们真的不能在Java中比较静态类和辛格尔顿在Java中,因为它们是完全不同的概念(我也不知道怎么静态类会比较与单身人士,但我会专注于Java在这个答案)。 Java中的static
关键字被重载并且有很多含义,因此可能会造成混淆。
是Singleton
自动的 “反模式”?我不这么认为。 滥用辛格尔顿是,但Singleton模式本身可以有很多很好的用途。它恰好被滥用了很多。如果你有合法的理由使用Singleton模式,使用它没有任何问题。
*注:为什么写
static
可言,你可能会问。事实证明,“非静态”嵌套类有其自己的内存管理含义,它的使用通常是不鼓励的,除非你有一个很好的理由(有关更多信息,请参阅其他问题)。
class SomeOtherClass {
Stuff stuff;
class Me {
void method(){
// I can access the instance variables of the outer instance
// like this:
System.out.println(SomeOtherClass.this.stuff);
// Just avoid using a non-static nested class unless you
// understand what its use is!
}
}
}
Singleton类本质上是一个常规的顶层类与private
构造,以保证它的单一性。 Singleton类本身提供了一种方法来获取它的实例。单身人士课程不容易测试,因此我们倾向于坚持Just Create Once的想法。
static
类本质上是一个嵌套类。嵌套类基本上是一个外层类,它为了方便打包而嵌套在另一个类中。*类不能声明为static
,至少在Java中 - 你应该自己尝试。
与单身人士 类相比,这是否会对静态 类有利?
根据上述说明,您的这个问题现在变得有些无效了。此外,一个static
类(当然嵌套)也可以是一个单例。
延伸阅读:
一个和其他的区别是内存管理,如果您的应用程序将有实例很多东西,那会灼伤记忆就像魅力成为记忆问题,表现等东西... 这可能有帮助...
http://butunclebob.com/ArticleS.UncleBob.SingletonVsJustCreateOne http://www.objectmentor.com/resources/articles/SingletonAndMonostate.pdf
这实际上是一篇很棒的文章,它讲述了单个问题以及何时以及如何使用它,如果您愿意的话。我不明白为什么有人会投下一票。 – 2013-07-12 01:47:47