Java单例和static成员变量的区别 singleton vs static field

public class StaticField {
    private static StringBuffer cache = new StringBuffer();

    public static void addString(String s){
        cache.append(s).append("/n");
    }

    public static void clear() {
        cache.setLength(0);
    }
}

public class Singleton {
    private static final Singleton ourInstance = new Singleton();

    public static Singleton getInstance() {
        return ourInstance;
    }

    private Singleton() {
    }

    private StringBuffer cache = new StringBuffer();

    public void addString(String s){
        cache.append(s).append("/n");
    }

    public void clear() {
        cache.setLength(0);
    }
}

static field会有以下的问题。

不能继承基类、实现接口。
无法进行依赖注入。不可以通过参数传递到其他方法。我觉得意义,单例根本不需要传递,单例在哪里都可以直接获取。
不能在其他类中进行测试(mock)。

如何选择?

static成员变量是给不需要状态的情况下使用的,通常只放一堆函数,例如Math和其他Utils类。

Singleton更为的灵活,更容易控制它的状态,可以实现接口,继承自其他类并给其他类继承。

https://stackoverflow.com/questions/47325586/singleton-class-vs-static-methods-and-fields
https://stackoverflow.com/questions/519520/difference-between-static-class-and-singleton-pattern

你可能感兴趣的:(Java单例和static成员变量的区别 singleton vs static field)