单身人士的奇怪行为
Strange behaviour of singleton
我将单例对象的引用赋值给null。
但仍然是单例的调用方法class。
这是我的代码
class Singleton {
private static Singleton singleton = new Singleton();
/*
* A private Constructor prevents any other class from instantiating.
*/
private Singleton() {
}
/* Static 'instance' method */
public static Singleton getInstance() {
return singleton;
}
/* Other methods protected by singleton-ness */
protected static void demoMethod() {
System.out.println("demoMethod for singleton");
}
}
public class SingletonDemo {
public static void main(String[] args) {
Singleton tmp = Singleton.getInstance();
tmp.demoMethod();
tmp = null;
tmp.demoMethod();
}
}
你正在调用 demoMethod
,这是一个静态方法 - 所以你的代码在这里:
tmp.demoMethod();
实际编译为:
Singleton.demoMethod();
这显然不取决于 tmp
的值。
这与单例方面完全无关:
public class Test {
public static void main(String[] args) {
String x = null;
System.out.println(x.valueOf(10)); // Calls String.valueOf(10)
}
}
请注意,Eclipse 在这些方法调用下方放置了黄色波浪线 - 我强烈怀疑如果您查看警告,您会看到它告诉您 不 调用静态方法像这样。听从建议,你不会有奇怪的行为...
这是因为 demoMethod()
是 static
(因此,它不是 Singleton
实例状态的一部分,而是 Singleton
实例状态的一部分class 定义)
发生的情况是您不是指变量 tmp
,而是指 class Singleton
通过 tmp
变量。这应该由 IDE 作为警告提出(通常,Eclipse 和 IntelliJ 会这样做)。
如果删除 static
关键字,您将获得预期的 NullPointerException
。
方法 demoMethod
是静态的。它不绑定到 Singleton
class 的任何实例。您应该将其更改为实例方法:
protected void demoMethod() {
System.out.println("demoMethod for singleton");
}
我将单例对象的引用赋值给null。
但仍然是单例的调用方法class。
这是我的代码
class Singleton {
private static Singleton singleton = new Singleton();
/*
* A private Constructor prevents any other class from instantiating.
*/
private Singleton() {
}
/* Static 'instance' method */
public static Singleton getInstance() {
return singleton;
}
/* Other methods protected by singleton-ness */
protected static void demoMethod() {
System.out.println("demoMethod for singleton");
}
}
public class SingletonDemo {
public static void main(String[] args) {
Singleton tmp = Singleton.getInstance();
tmp.demoMethod();
tmp = null;
tmp.demoMethod();
}
}
你正在调用 demoMethod
,这是一个静态方法 - 所以你的代码在这里:
tmp.demoMethod();
实际编译为:
Singleton.demoMethod();
这显然不取决于 tmp
的值。
这与单例方面完全无关:
public class Test {
public static void main(String[] args) {
String x = null;
System.out.println(x.valueOf(10)); // Calls String.valueOf(10)
}
}
请注意,Eclipse 在这些方法调用下方放置了黄色波浪线 - 我强烈怀疑如果您查看警告,您会看到它告诉您 不 调用静态方法像这样。听从建议,你不会有奇怪的行为...
这是因为 demoMethod()
是 static
(因此,它不是 Singleton
实例状态的一部分,而是 Singleton
实例状态的一部分class 定义)
发生的情况是您不是指变量 tmp
,而是指 class Singleton
通过 tmp
变量。这应该由 IDE 作为警告提出(通常,Eclipse 和 IntelliJ 会这样做)。
如果删除 static
关键字,您将获得预期的 NullPointerException
。
方法 demoMethod
是静态的。它不绑定到 Singleton
class 的任何实例。您应该将其更改为实例方法:
protected void demoMethod() {
System.out.println("demoMethod for singleton");
}