单身人士的奇怪行为

时间:2015-05-19 18:49:30

标签: java singleton

我将singleton对象的引用赋值为null。

但它仍在调用Singleton类的方法。

这是我的代码

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();

    }
}

enter image description here

3 个答案:

答案 0 :(得分:5)

这是因为library(tidyr) library(dplyr) df <- df %>% gather(type, count, -id) df <- df[complete.cases(df),][,-3] df[order(df$id),] id type 1 1 conditionA 7 2 conditionB 13 3 conditionC 19 4 conditionD 5 5 conditionA demoMethod()(就是这样,它不属于static实例状态的一部分,但是相当于类定义的一部分)

您所做的不是指变量Singleton,而是指tmp 通过 Singleton变量。这应该是由IDE引发的警告(通常是Eclipse和IntelliJ)。

如果您删除了tmp关键字,那么您将获得预期的static

答案 1 :(得分:4)

您正在调用@Min(100) private Long cost; ,这是一种静态方法 - 所以您的代码在这里:

demoMethod

实际上正在编译为:

tmp.demoMethod();

这显然不取决于Singleton.demoMethod(); 的价值。

这与单身方面完全无关:

tmp

请注意,Eclipse在这些方法调用下放置了黄色波浪线 - 我强烈怀疑如果你看一下警告,你会看到它告诉你调用这样的静态方法。遵循建议,你不会得到奇怪的行为......

答案 2 :(得分:1)

方法demoMethod是静态的。它不受Singleton类的任何实例的约束。您应该将其更改为实例方法:

protected void demoMethod() {
    System.out.println("demoMethod for singleton");
}