为什么Singleton Design Pattern中对象的访问器方法必须是“静态的?

时间:2016-10-11 07:43:05

标签: java static singleton

在单例设计模式中,我们使用私有构造函数将对象的创建限制为单个对象。

为了提供它的全局句柄,我们使用“公共静态”方法。

我的问题是为什么需要静电?为什么不公开?

2 个答案:

答案 0 :(得分:3)

简答:

假设你有一个Singleton类:

public class Singleton {
    ...
}

然后构造函数可能是私有的,这意味着你不能使用另一个类的new Singleton()

因此,访问Singleton类内部内容的唯一方法是使用Singleton.methodName()Singleton.fieldName

但是为了做到这一点,这些方法和字段不能成为对象的一部分,它们必须是 static getSingleton()getInstance()方法也不例外。

回答示例:

假设你有一个Singleton类:

public class Singleton {

}

我们现在可以添加构造函数了。但它不能公开,因为如果它是公开的那么你可以只使用来自其他每个类的new Singleton()然后它就不再是单身人士了。所以课程现在看起来像这样。

public class Singleton {

    private Singleton(){

    }

}

现在构造函数是私有的,这意味着你不能从另一个类实例化它,它也可以从Singleton类中实例化。因此,我们应该添加getInstance()getSingleton()方法。

public class Singleton {

    private Singleton(){

    }

    public Singleton getSingleton(){
        return null;
    }

}

但是现在我们无法访问它,因为getSingleton()方法只能用在一个对象上,我们无法从类外部实例化一个Singleton对象。因此,getSingleton()需要使用Singleton.getSingleton()进行访问,因此必须成为静态方法。

public class Singleton {

    private Singleton(){

    }

    public static Singleton getSingleton(){
        return null;
    }

}

到目前为止的答案应该回答这个问题,但它不是一个功能性的Singleton类。所以请继续阅读以获得完整的答案。

现在我们还想从getSingleton()方法返回Singleton的实例。所以我们还想要一个名为singleton实例的字段指向Singleton类的实例。

public class Singleton {
    private Singleton instance;

    private Singleton(){

    }

    public static Singleton getSingleton(){
        return instance;
    }

}

但是现在get getSingleton()方法无法访问实例字段,因为现在编写类的方式实例是对象的字段而不是类,因此实例字段必须变为静态的。

public class Singleton {
    private static Singleton instance;

    private Singleton(){

    }

    public static Singleton getSingleton(){
        return instance;
    }

}

现在最后一个问题是变量实例没有在任何地方实例化,所以它总是会返回null。因此,我们必须检查getSingleton(),如果实例为null,则创建new Singleton()并使实例字段指向它。

public class Singleton {
    private static Singleton instance;

    private Singleton(){

    }

    public static Singleton getSingleton(){
        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }

}

如果你想要一个线程安全的Singleton类,你可以使用类似的东西(由Boris the Spider建议):

public enum Singleton {
    INSTANCE;
    private Singleton(){
        // TODO
    }    
}

现在单身人士已经完成了。

答案 1 :(得分:1)

如果方法是公共的并且没有静态,则需要该类的实例才能调用该方法..这没有任何意义。

静态方法可以在没有实例的情况下调用,因为它们属于类