繁体   English   中英

静态类vs单例类

[英]static class vs singleton class

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

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

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

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

-Ivar

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

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中的静态类和Singleton,因为它们在Java中是完全不同的概念 (我也不确定静态类与Singleton相比如何,但我会在这个答案中专注于Java)。 Java中的static关键字是重载的,具有很多含义,因此可能会让人感到困惑。

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类本身提供了一种获取其实例的方法。 Singleton类不是很容易测试,因此我们倾向于坚持Just Create Once的想法。

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

与singleton类相比,这对静态类来说是不利的吗?

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

进一步阅读:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM