为什么单例静态方法 getNext() returns 增加值
Why singletons static method getNext() returns incremented value
我有一个带有静态方法的单例 class 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
这是为什么?根据我对 static
的理解,我认为输出总是 1
。
我理解使用 static
方法不需要创建 class(对象)的实例。当未创建对象时,每次调用静态 getNext()
方法都应增加新的(虚拟)实例变量 counter = 0
和 return。
但我的程序的行为方式与非静态方法完全相同。为什么?可能我误解了某些事情或简化了事情。
这是因为计数器字段也是静态的(class 作用域)。所以在你的静态方法中,它确实不需要实例,你增加了一个静态变量,它也不需要 Sequence 实例。
如果您从计数器字段中删除静态修饰符,代码将无法编译,因为您需要在 getNext() 方法中使用一个实例。您可以通过将其更改为:
来解决此问题
public static int getNext(){ return getInstance().counter++;}
也许这样做会更好:
public int getNext(){ return ++counter;}
然后像这样使用此代码:
System.out.println(Sequence.getInstance().getNext());
new (virtual) instance variable counter
= 0 and return it.
What '新(虚拟)实例变量counter
?
它是静态的。这意味着它不是实例变量。
every call to static getNext() method should increment new (virtual) instance variable counter = 0 and return it
不,静态变量(如 counter
是)是一个 class 变量,这意味着它只有一个实例,因此在每次调用静态方法时都会递增相同的变量.
如果 counter
不是静态的并且您更改 getNext()
以创建新的 Sequence
实例,您将得到预期的行为:
public static int getNext(){
Sequence seq = new Sequence ();
seq.counter += 1;
return seq.counter;
}
但是 Sequence
就不是单身人士了。
您对 static 的含义有误解。这意味着 not final 或 unchangable。在方法级别使用静态 connect 方法与您的 class 而不是 class 的实例。这同样适用于变量。您的 counter 变量也是 static,因此 Sequence 的每个实例都使用相同的变量,没有实例特定的变量。
我有一个带有静态方法的单例 class 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
这是为什么?根据我对 static
的理解,我认为输出总是 1
。
我理解使用 static
方法不需要创建 class(对象)的实例。当未创建对象时,每次调用静态 getNext()
方法都应增加新的(虚拟)实例变量 counter = 0
和 return。
但我的程序的行为方式与非静态方法完全相同。为什么?可能我误解了某些事情或简化了事情。
这是因为计数器字段也是静态的(class 作用域)。所以在你的静态方法中,它确实不需要实例,你增加了一个静态变量,它也不需要 Sequence 实例。
如果您从计数器字段中删除静态修饰符,代码将无法编译,因为您需要在 getNext() 方法中使用一个实例。您可以通过将其更改为:
来解决此问题public static int getNext(){ return getInstance().counter++;}
也许这样做会更好:
public int getNext(){ return ++counter;}
然后像这样使用此代码:
System.out.println(Sequence.getInstance().getNext());
new (virtual) instance variable
counter
= 0 and return it.
What '新(虚拟)实例变量counter
?
它是静态的。这意味着它不是实例变量。
every call to static getNext() method should increment new (virtual) instance variable counter = 0 and return it
不,静态变量(如 counter
是)是一个 class 变量,这意味着它只有一个实例,因此在每次调用静态方法时都会递增相同的变量.
如果 counter
不是静态的并且您更改 getNext()
以创建新的 Sequence
实例,您将得到预期的行为:
public static int getNext(){
Sequence seq = new Sequence ();
seq.counter += 1;
return seq.counter;
}
但是 Sequence
就不是单身人士了。
您对 static 的含义有误解。这意味着 not final 或 unchangable。在方法级别使用静态 connect 方法与您的 class 而不是 class 的实例。这同样适用于变量。您的 counter 变量也是 static,因此 Sequence 的每个实例都使用相同的变量,没有实例特定的变量。