簡體   English   中英

靜態類vs單例類

[英]static class vs singleton class

我知道這個話題已被一遍又一遍地討論和殺死,但我仍有一個疑問,我希望有人可以幫助我或指導我在SO上預先存在的帖子。

在傳統的C中,靜態變量存儲在數據段中,局部變量存儲在堆棧中。 與局部變量相比,我認為這會使靜態變量的存儲和維護成本更高。 對?

當試圖用Java或C#來理解時,與單例類相比,這對於靜態類是不利的嗎? 由於整個類在類初始化之前被加載到內存中,所以除非我們有小的內聯函數,否則我看不出它有什么優勢。

我喜歡Singleton課程,並且不願意看到它成為一種反模式,我仍然在尋找它帶來的所有優點......然后松散於其他人的線程安全論證。

-Ivar

與C不同,Java類定義中的static關鍵字僅僅意味着, 這只是一個普通的類,就像任何其他類一樣,但它恰好在另一個類中聲明來組織代碼 換句話說,以下兩種聲明方式*之間沒有任何行為差異:
一個)

class SomeOtherClass {
    static class Me {
        // If you "upgrade" me to a top-level class....
    }
}

b)

class Me {
    // I won't behave any different....
}

當第一次使用類時,類定義被加載到內存中,對於“靜態”和“非靜態”類都是如此。 內存的使用方式也沒有區別。 在較舊的JVM中,對象始終存儲在堆中。 現有JVM在可能和有益的情況下確實在堆棧上分配對象,但這種優化對編碼器是透明的(不可能通過代碼影響這種行為),並且使用static關鍵字對此行為沒有任何影響。

現在,回到你原來的問題,正如我們所看到的,我們真的無法比較Java中的靜態類和Singleton,因為它們在Java中是完全不同的概念 (我也不確定靜態類與Singleton相比如何,但我會在這個答案中專注於Java)。 Java中的static關鍵字是重載的,具有很多含義,因此可能會讓人感到困惑。

Singleton自動成為“反模式”嗎? 我不這么認為。 單身人士的濫用是,但單身人士模式本身可以有很多好的用途。 它恰好被濫用了很多。 如果您有合理的理由使用Singleton模式,使用它沒有任何問題。



*注意:為什么要寫static ,你可能會問。 事實證明,“非靜態”嵌套類有其自身有些復雜的內存管理含義,除非你有充分的理由,否則通常不鼓勵使用它(請參閱其他問題以獲取更多信息)。

 class SomeOtherClass { Stuff stuff; class Me { void method(){ // I can access the instance variables of the outer instance // like this: System.out.println(SomeOtherClass.this.stuff); // Just avoid using a non-static nested class unless you // understand what its use is! } } } 

Singleton類本質上是一個帶有private構造函數的常規頂級類,以保證其單一性。 Singleton類本身提供了一種獲取其實例的方法。 Singleton類不是很容易測試,因此我們傾向於堅持Just Create Once的想法。

static class本質上是一個嵌套類。 嵌套類本質上是一個外層類,它嵌套在另一個類中,只是為了方便打包。 至少在Java中不能將頂級類聲明為static - 您應該自己嘗試。

與singleton類相比,這對靜態類來說是不利的嗎?

根據上面的解釋,你的這個問題現在變得有些無效了。 此外, static類(當然是嵌套的)也可以是單例。

進一步閱讀:

一個和另一個之間的差異是內存管理,如果你的應用程序必須實例化很多東西,那就會把內存像魅力變成一個內存問題,性能和其他東西......這可能會有所幫助......

http://butunclebob.com/ArticleS.UncleBob.SingletonVsJustCreateOne http://www.objectmentor.com/resources/articles/SingletonAndMonostate.pdf

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM