关于Java:singleton与静态方法和字段?

Singleton class vs static methods and fields?

本问题已经有最佳答案,请猛点这里访问。

为什么在Android/Java中使用单级类,当使用一个具有静态字段和方法的类来提供相同的功能时?

例如

1
2
3
4
5
6
7
8
9
10
11
public class StaticClass {
    private static int foo = 0;

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

    public static int getFoo() {
        return foo;
    }
}

VS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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;
    }
}


这主要是由于static typessingletons的限制。哪些是:

  • 静态类型不能实现接口并从基类派生。
  • 从上面我们可以看到静态类型会导致高耦合——您不能在测试和不同环境中使用其他类。
  • 不能使用依赖项注入来注入静态类。
  • 单件更容易模仿和填隙。
  • 单子可以很容易地转换成瞬变。

这是我头脑中的几个原因。这可能不是全部。