为什么单例静态方法 getNext() 返回递增值

Why singletons static method getNext() returns incremented value

提问人:blekione 提问时间:10/28/2015 更新时间:10/28/2015 访问量:440

问:

我有一个带有静态方法的单例类getNext()

public class Sequence {

   private static Sequence  instance;
   private static int counter;

   private Sequence () { // note: private constructor
      counter = 0;
   }

   public static Sequence getInstance(){
      if(instance==null) { // Lazy instantiation
         instance = new Sequence(); 
      }
      return instance;
   }

   public static int getNext(){ return ++counter;}
}

在我的测试代码中,我有一个 for 循环,它调用了几次getNext()

public class TestSequence {
   public static void main(String[] args) {
      for (int i = 0; i < 5; i++)
         System.out.println(Sequence.getNext());        
   }

}

它的输出是

1
2
3
4
5

为什么?根据我的理解,我认为输出总是会是 .static1

我理解方法的使用,不需要创建类(对象)的实例。如果未创建对象,则每次调用静态方法都应递增新的(虚拟)实例变量并返回它。staticgetNext()counter = 0

但是我的程序的行为方式与非静态方法完全相同。为什么?可能我误解了某些事情或简化了事情。

爪哇岛 设计模式 单身 人士

评论

3赞 SomeJavaGuy 10/28/2015
static 并不意味着它每次调用时都会再次初始化自身。你宁愿阅读静态的真正含义,因为你似乎不理解它。getNext

答:

0赞 makasprzak 10/28/2015 #1

这是因为计数器字段也是静态的(类范围)。因此,在确实不需要实例的静态方法中,您可以递增一个也不需要 Sequence 实例的静态变量。

但是,如果从计数器字段中删除静态修饰符,则代码将无法编译,因为您需要在 getNext() 方法中有一个实例。但是,您可以通过将其更改为以下方式来解决此问题:

public static int getNext(){ return getInstance().counter++;}

可能更好的做法是这样做:

public int getNext(){ return ++counter;}

然后像这样使用以下代码:

System.out.println(Sequence.getInstance().getNext());
-1赞 user207421 10/28/2015 #2

new (virtual) instance variable = 0 并返回它。counter

什么'新的(虚拟)实例变量?counter

它是静态的。这意味着它不是实例变量。

7赞 Eran 10/28/2015 #3

每次调用静态 getNext() 方法都应递增新的(虚拟)实例变量 counter = 0 并返回它

否,静态变量(按原样)是类变量,这意味着它只有一个实例,因此在每次调用静态方法时,相同的变量都会递增。counter

如果不是静态的,您将获得预期的行为,并且您更改以创建新实例:countergetNext()Sequence

public static int getNext(){
    Sequence seq = new Sequence ();
    seq.counter += 1;
    return seq.counter;
}

但那样就不会是单身人士了。Sequence

0赞 wumpz 10/28/2015 #4

你对静态的含义有误解。它意味着不是最终的或不可更改的。在方法级别使用 static 确实会将方法与类连接起来,而不是与类的实例连接起来。这同样适用于变量。计数器变量也是静态的,因此 Sequence 的每个实例都使用相同的变量,而不是特定于实例的变量。