由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!
}
}
}
这实际上是一篇很棒的文章,它讲述了单个问题以及何时以及如何使用它,如果您愿意的话。我不明白为什么有人会投下一票。 – 2013-07-12 01:47:47