单身人士的奇怪行为

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");
}