单例类与静态方法和字段? [复制]

Posted

技术标签:

【中文标题】单例类与静态方法和字段? [复制]【英文标题】:Singleton class vs static methods and fields? [duplicate] 【发布时间】:2018-04-29 18:01:36 【问题描述】:

为什么在 android/Java 中使用单例类,而 看起来 是通过使用具有静态字段和方法的类来提供的?

例如

public class StaticClass 
    private static int foo = 0;

    public static void setFoo(int f) 
        foo = f;
    

    public static int getFoo() 
        return foo;
    

public class SingletonClass implements Serializable 

    private static volatile SingletonClass sSoleInstance;
    private int foo;

    //private constructor.
    private SingletonClass()

        //Prevent form the reflection api.
        if (sSoleInstance != null)
            throw new RuntimeException("Use getInstance() method to get the single instance of this class.");
        

        foo = 0;
    

    public static SingletonClass getInstance() 
        if (sSoleInstance == null)  //if there is no instance available... create new one
            synchronized (SingletonClass.class) 
                if (sSoleInstance == null) sSoleInstance = new SingletonClass();
            
        

        return sSoleInstance;
    

    //Make singleton from serialize and deserialize operation.
    protected SingletonClass readResolve() 
        return getInstance();
    

    public void setFoo(int foo) 
        this.foo = foo;
    

    public int getFoo() 
        return foo;
    

【问题讨论】:

请通过This 关于 SO 的讨论。如果你还没有! 谢谢,我应该删除这个问题吗? 这是一个合理的问题。但是所有的讨论都已经在我提到的线程中进行了。所以只需将其标记为重复。 【参考方案1】:

这主要是由于static typessingletons 的限制。分别是:

静态类型不能实现接口和从基类派生。 从上面我们可以看出,静态类型会导致高耦合——你不能在测试和不同的环境中使用其他类。 不能使用依赖注入来注入静态类。 Singleton 更容易模拟和填充。 单例可以轻松转换为瞬态。

我想到了这几个原因。这可能还不是全部。

【讨论】:

以上是关于单例类与静态方法和字段? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

单例类和静态类的区别? [复制]

单例模式的五种实现方法

请问java 单例类 与 静态类 有何不同?

Singleton类的优势是啥? [复制]

静态方法与单例模式的区别

静态类和单例模式区别