我知道这个话题已被一遍又一遍地讨论和杀死,但我仍有一个疑问,我希望有人可以帮助我或指导我在SO上预先存在的帖子.
在传统的C中,静态变量存储在数据段中,局部变量存储在堆栈中.与局部变量相比,我认为这会使静态变量的存储和维护成本更高.对?
当试图用Java或C#来理解时,与单例类相比,这对于静态类是不利的吗?由于整个类在类初始化之前被加载到内存中,所以除非我们有小的内联函数,否则我看不出它有什么优势.
我喜欢Singleton课程,并且不愿意看到它成为一种反模式,我仍然在寻找它带来的所有优点......然后松散于其他人的线程安全论证.
-Ivar
与C不同static,Java类定义中的关键字仅仅意味着,这只是一个普通的类,就像任何其他类一样,但它恰好在另一个类中声明来组织代码.换句话说,以下两种声明方式*之间没有任何行为差异:
a)
class SomeOtherClass {
static class Me {
// If you "upgrade" me to a top-level class....
}
}
Run Code Online (Sandbox Code Playgroud)
b)
class Me {
// I won't behave any different....
}
Run Code Online (Sandbox Code Playgroud)
当第一次使用类时,类定义被加载到内存中,对于"静态"和"非静态"类都是如此.内存的使用方式也没有区别.在较旧的JVM中,对象始终存储在堆中.现有的JVM 在可能和有益的情况下确实在堆栈上分配对象,但是这种优化对编码器是透明的(不可能通过代码影响这种行为),并且使用static关键字对此行为没有任何影响.
现在,回到你原来的问题,正如我们所看到的,我们真的无法在Java中比较静态类和Singleton,因为它们在Java中是完全不同的概念(我也不确定静态类与Singleton相比如何,但我会在这个答案中专注于Java).staticJava中的关键字是重载的,具有很多含义,因此可能会令人困惑.
是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!
}
}
}
Run Code Online (Sandbox Code Playgroud)