2011-05-23 66 views
5

我知道这个话题已经被讨论过并且一遍又一遍地被杀死,但是我仍然有一个疑问,那就是我希望有人能够帮助我,或者引导我到SO上的预先存在的帖子。静态类vs单身类

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

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

我爱单身类,并不愿看到它变成一个反模式,我现在还在找工作随之而来......然后松线程安全等参数的所有优点。

-Ivar

回答

7

由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! 
     } 
    } 
} 
3

Singleton类本质上是一个常规的顶层类与private构造,以保证它的单一性。 Singleton类本身提供了一种方法来获取它的实例。单身人士课程不容易测试,因此我们倾向于坚持Just Create Once的想法。

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

与单身人士 类相比,这是否会对静态 类有利?

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

延伸阅读: