天天看點

java單例和靜态類差別

Java中單例與靜态的差別?

靜态類比單例具有更好的性能,因為靜态方法在編譯期綁定

再次,它們的差別是override的能力,因Java中的靜态方法是不可以覆寫的,這就導緻其木有太多的靈活性,另一面,你可通過繼承的方式覆寫單例類中定義的方法

靜态類很難模拟,是以難于單例測試,單例更容易模拟,因為也比靜态類易于編寫單元測試,不論神馬單例期望神馬,你都可以傳遞模拟對象,例如構造方法或方法參數

如果你的需求中需要維護狀态資訊,則單例比靜态類更适合,因為後者在維護狀态資訊方面是非常可怕的,并導緻狡滑的bug

如果是一個非常重的對象,單例可以懶加載,但是靜态類沒有這樣的優勢,并且非常熱切的加載

許多依賴注入的架構對單例都有良好的管理,例如Spring,使用它們非常容易。

單例模式作為一種常見的設計模式,在程式中非常常見,主要是為了保證一個類隻有一個唯一的對象。

靜态内部類實作,線程安全。

public class SingletonPattern {

    private SingletonPattern() {
    }

    private static class SingletonPatternHolder {
        private static final SingletonPattern singletonPattern = new SingletonPattern();
    }

    public static SingletonPattern getInstance() {
        return SingletonPatternHolder.singletonPattern;
    }
}
           

這種方式的優點是:

不用 synchronized ,節省時間。

調用 getInstance() 的時候才會建立對象,不調用不建立,節省空間。