導航:首頁 > 編程語言 > java單例靜態類

java單例靜態類

發布時間:2023-02-06 07:18:05

1. 關於java靜態內部類形式的單例模式

static Singleton instance = new Singleton();

static類型的成員變數,只會在新建類的對象時被執行一次。

所以static Singleton instance = new Singleton(); 只有在第一次調用時,被new一次。之後獲取的都是第一次執行的對象。所以稱之為單例。

也可以使用老的寫法,比較清晰一些。

classABC{
privatestaticABCinstance;
privateABC(){}
publicABCgetInstance(){
if(instance==null)
instance=newABC();
returninstance;
}
}
這樣寫法的缺點是效率不如
classABC{
privatestaticABCinstance=newABC();
privateABC(){}
publicABCgetInstance(){
returninstance;
}
}
這樣寫法高。

2. 單例模式&靜態類

    單例模式指的是在應用整個生命周期內只存在一個實例。單例模式是一種被廣泛使用的設計模式。他能夠避免實例對象的重復創建,減少創建實例的系統開銷,節省內存。

    靜態類就是一個類內部是靜態方法和靜態field,構造器被private修飾,因此不能被實例化。Math類就是一個靜態類。

(1)單例模式更加靈活,其中的方法可以被重寫,而靜態類中的方法皆為靜態,無法被重寫;

(2)當一個類佔用資源多時,單例模式可以採用懶載入模式,靜態類無法做到.

    靜態的綁定是在編譯期進行的,也就是說靜態類中的方法從一開始就全部載入完畢了。而單例模式分為「餓漢模式」、「懶漢模式」。在「餓漢模式下」,單例模式的類在獲取instance前就已經初始化好了,這種方式適合類佔用資源較少的情況;在「懶漢模式」下,單例模式可以在使用時才被初始化,這種方式適合類佔用資源較多的情況,這樣就成功避免了資源浪費的問題。

    當只需要一些簡單的工具方法時,使用靜態類,因為靜態類更方便,更快速。當你需要面向對象的能力時(繼承,多態),使用單例模式。

    

3. Java中單例模式和靜態類的區別

單例模式:

在框架中通過反射機制在程序運行時由框架生成一個類的實例,該實例是由框架負責維護;當然我們自己也可以實例化這個類,此時我們自己實例化的對象和框架維護的實例是互不影響的;

類的實例對象是由引用指向堆中保存的,單例是由框架中的引用指向堆中的一個實例,而我們自己創建的對象是另一個指向堆中的實例兩個互不幹擾;但是在使用起來,我們在不同地方改變單例全局的單例都變了,看起來好像靜態一樣但是實際上我們使用的只不過都是框架維護的一個實例而已;

舉例:

@Component
publicclassPerson{
privateStringname;
PrivateIntegerage;
//getset方法...省略不想寫;
}

在框架啟動時,我們就獲得了一個Person類的實例,這個實例由框架內部一個引用指向,在程序使用時我們只需把地址賦於需要的地方,也就是說實際上大家用的都是一個對象;

就在這時,我們自己開心的new 了一個Person對象;此時我們通過set方法改變該對象不影響其他指向單例對象的變數;


靜態類:

首先java中的靜態類指的大多數是內部類;作為一個成員變數它靜態才有意義,此時無論程序中的任何部分調用了該靜態類的外部類,並通過方法改變了內部類的數據;此時該程序中的所有該內部類的實例都改變了,互相影響;因為靜態變數是存儲在方法區內的,而且就一份,無論誰使用該靜態變數都是去方法區查詢該對象的狀態,所以互相干擾;

4. Java中單例模式和靜態類的區別

單例模式與靜態類(一個類,所有方法為靜態方法)是另一個非常有趣的問題,在《Java中有關單例模式的面試問題》博文中露掉了,由於單例模式和靜態類都具有良好的訪問性,它們之間有許多相似之處,例如,兩者可以直接使用而無須創建對象,都可提交唯一實例,在一個非常高的高度上看起來它們都為是用於同樣的任務。由於它們具有較多的相似性,面試官常常會問一些類似為神馬使用單例模式替換靜態方法?你能使用靜態類替換單例模式嗎?Java中單例模式與靜態的區別有那些?等這樣的問題,為回答這些問題,記住他們單例模式和靜態方法之間基本的區別是非常重要的,前者給你一個Object,後者僅僅提供靜態方法,由於對像比方法具有較強的能力,可以指導你神馬時候使用單例模式與靜態方法。

在本文中,我們會了解神馬Java中的神馬地方使用單例模式,神馬時候使用靜態類更好,順便說下,JDK中有幾個關於兩者的例子,並且這例子非常聰明的,例如java.lang.Math是一個final類,並且其方法為靜態方法,另一方面java.lang.Runtime是一個單例的類。對於那些不熟悉單例模式或靜態類的人,靜態類就是一個Java類,它僅包含靜態方法,一個非常好靜態類的例子就是java.lang.Math,它包括了許多為不同數據功能實現工具方法,例如sqrt(),而單例類,在整個應用生命周期內只有一個實例,例如java.lang.Runtime。

神馬時候在Java中使用靜態類替換單例

確實存在一些場景,靜態類比單例更適合,這個場景中主要的一個例子就是java.lang.Math,它不是單例的,其所有方法都是靜態方法,這里我給出幾個場景,我覺得使用靜態類比單例模式更適合。

1)
如果你的單例不需要維護任何狀態,僅僅提供全局訪問的方法,這種情況考慮使用靜態類,靜態方法比單例更快,因為靜態的綁定是在編譯期就進行的。但是要記住,不建議在靜態類中維護狀態信息,特別是在並發環境中,若無適當的同步措施而修改多線程並發時,會導致壞的競態條件。

如果你需要將一些工具方法集中在一起時,你可以選擇使用靜態方法,但是別的東西,要求單例訪問資源時,應該使用單例模式。

Java中單例與靜態的區別

這是回答關於單例與靜態的第二面試問題,如我早些提到過的,它們基本的區別一個表現類,一個表現方法,下面列幾條它們之間的區別。

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

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

3) 靜態類很難模擬,因此難於單例測試,單例更容易模擬,因為也比靜態類易於編寫單元測試,不論神馬單例期望神馬,你都可以傳遞模擬對象,例如構造方法或方法參數。

4) 如果你的需求中需要維護狀態信息,則單例比靜態類更適合,因為後者在維護狀態信息方面是非常可怕的,並導致狡滑的bug。

5) 如果是一個非常重的對象,單例可以懶載入,但是靜態類沒有這樣的優勢,並且非常熱切的載入。

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

兩者之間的這些區別,有助於我們在面對一些場景時做出選擇,下一節中了解神馬時候選擇單例而不是靜態類。

Java中,選擇單例而不是靜態類的優點

單例與靜態主要的優點是前者比後者更具有面向對象的能力,使用單例,可以通過繼承和多態擴展基類,實現介面和更有能力提供不同的實現,如果我們討論java.lang.Runtime,在Java中它是單例,調用getRuntime()方法,會基於不同的JVM返回不同的實現,但也保證了每個JVM中實有一個實例,如果java.lang.Runtime是一個靜態類,不太可能因不同的JVM返回不同的實現。

這就是Java中單例與靜態類的區別,當你需要一個全OO能力的對象時,選擇單例,如果僅僅是將一些靜態方法預售,使用靜態類。

5. 單例模式和靜態類的區別

https://www.cnblogs.com/windpoplar/p/12944952.html

1>什麼時候使用靜態類代替singleton :

這里有幾個很好的靜態類比singleton更好的應用場景. 最基本的例子就是在Java中的java.lang.Math類的實現方式, Math類就是用過靜態方法來實現的,而不是單例來實現的.

總結 :

如果你的singleton不提維持任何狀態, 僅僅是提供全局的訪問 , 這個時候就適合用靜態類 , 這樣速度也更快, 因為static bind在編譯期間(compile ring) . 記住不經意維持子類的狀態 , 尤其是在並發的情況下, 多個線程並發修改,這容易導致不容易發現的race condition 關於race condition .

靜態類適用於一些工具類 , 其他的如單個訪問資源就可以用singleton.

2>靜態類和singleton之間的區別 :

① static類有更好的訪問效率(Static class provides better performance than Singleton pattern, because static methods are bonded on compile time)

③ singleton比static class更容易測試. 那個容易模擬(mock), 哪個就容易測試. singleton很容易用JUnit測試, 因為你能夠傳遞mock對象, 當singleton需要的時候(作為方法參數或者構造函數參數),

④ 如果你的需求是維護(maintain)狀態, 那麼singleton比static class更好 , 如果使用static class會出現一些問題.

⑤ singleton支持延遲載入 , 而static class 則不支持這樣的特性 , 在重量級的對象, 延遲載入就顯得非常重要.

⑥ 在一些依賴注入(Dependency injection framework)的框架 , 它能夠很好的管理singleton對象 . 例如Spring.

3>singleton相對於靜態類的一些高級特點 :

singleton 對於static class 主要的優點是更加面向對象 . 對於singleton你可以使用繼承(Inheritance)和多態(polymorphism)來繼承一個基類, 實現一個介面, 提供不同功能 的實現. 例如 , Java中java.lang.Runtime ,該類就是一個singleton的, 調用getRuntime(),基於不同的JVM ,返回不同的實現對象, 針對一個一個JVM,確保只有一個Runtime對象 , 如果使用static class就不能很好的來實現這樣的功能了 .

https://blog.csdn.net/weixin_42957931/article/details/106840172

1,應用場景
概況:當需要資源共享且需要控制資源的時候
1)有頻繁實例化然後銷毀的情況,也就是頻繁的new對象的時候,可以考慮單例模式。
舉例一:
統計上機在線人數,也就是全局計算器,所有用戶在相同時刻獲取到的在線人數是一致的。這里就需要一個全局的唯一訪問點,所以計數器就要唯一。

2)創建對象時,消耗的時間和資源過多,但又經常用到的對象
舉例二:配置文件訪問類,項目中需要一些環境相關的配置文件。如果不用單例,每次調用都要new對象,每次都要重新讀一遍配置文件,很影響性能。如果用單例,則只需要讀取一遍就可以了。

三、單例與static的區別
1,static在類載入時執行一次,其生命周期是跪著類方法的執行而結束,其不需要再new對象,因為在類載入時就new對象了。所以static有更好的性能。

2,工具類適用於static,因為有更好的訪問效率(和狀態有關的用單例模式,如游戲中全局的一些狀態和變數)

3,單例模式更加面向對象,可使用繼承或多態來繼承一個基類,實現一個借口,不同的功能。

6. 單例與靜態類

單例模式指的是在應用 整個生命周期內只能存在一個實例。 單例模式是一種被廣泛使用的設計模式。他有很多好處,能夠避免實例對象的重復創建,減少創建實例的系統開銷,節省內存。

靜態類就是一個類裡面都是靜態方法和靜態field,構造器被private修飾,因此不能被實例化。Math類就是一個靜態類。

參考
到底是用"靜態類"還是單例

7. java中關於單例和靜態類的區別

單例是一種模式。這種模式的最終目的在於一個對象。
靜態類是一個語法…… 就是讓你在類裡面能寫一個普通的類而已……
這兩個到底有啥關系以至於你會去思考它們的區別?

8. 請問java 單例類 與 靜態類 有何不同

它們有自己的作用,靈活運用即可
簡單說明:
單例類
Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。
在很多操作中,比如建立目錄 資料庫連接都需要這樣的單線程操作。
最顯而易見的好處是,節約開銷,比如資料庫鏈接單例的好處是,每次你只要去獲取那個資料庫的實例就好,不用每次去創建一個實例。

靜態類
在一個類中創建另外一個類,叫做成員內部類。這個成員內部類可以靜態的(利用static關鍵字修飾),也可以是非靜態的。由於靜態的內部類在定義、使用的時候會有種種的限制。所以在實際工作中用到的並不多。
在開發過程中,內部類中使用的最多的還是非靜態地成員內部類。不過在特定的情況下,靜態內部類也能夠發揮其獨特的作用。

9. JAVA static 單例模式

單例模式可以理解為是面向對象語言中對全局變數的一種實現,當然的作用不僅僅限於此。我們可以對單例模式實現的過程中的思路進行一下剖析,如此更加清楚的認識到設計模式究竟是什麼,當然也可以證明一下基礎知識的重要性(基礎才是王道)。
首先我們分析一下單例的意義,在Java中為一個類只能有一個實例化對象。這顯然不是我們平常所寫的一個普通類所能夠做到的事情。那麼為了實現這一個要求該如何去做呢。實例化是一個類的初始化時候的問題,而初始化是構造方法去做的事情(當然這裡面jvm也幫我們做了很多的事情)。構造方法,我們要設為私有。這樣我們讓該類不能被隨意的初始化,那該在哪初始化,而它有怎樣被調用呢。
一個不能初始化的類,也就是說不能夠被實例化的類,我們想要調用。那麼無疑讓我們想到了static關鍵字,一個public static 的方法可以實現我們這個要求——即在不實例化類的情況下能夠調用其中的方法。於是我們寫下了一個public static 的方法,用於得到這個類的唯一實例。而這個實例我們是在類的內部實例,並同樣定義為 static 的變數(一直用static 只是為了能夠不實例化便可以使用。因為static可以在類初始化的時候便生成了,對於此不理解的同學們可以查看我的前一篇博客。。。)。到這里我們一個單例模式的實現框架其實已經搭好了。

閱讀全文

與java單例靜態類相關的資料

熱點內容
如何用app覆蓋全部曲庫 瀏覽:602
變異布林源碼 瀏覽:684
表格加密設置列印區域 瀏覽:437
卡耐基pdf下載 瀏覽:922
現在最流行的單片機 瀏覽:88
機頂盒刷機源碼 瀏覽:985
編碼pdf下載 瀏覽:944
隔壁同學app怎麼 瀏覽:299
c語言宏命令 瀏覽:542
php卡死源碼 瀏覽:574
time庫中的clock函數python 瀏覽:989
cad視覺移動命令怎麼打開 瀏覽:821
安卓java調用python 瀏覽:395
java標准時間 瀏覽:137
華為伺服器湖北渠道商雲主機 瀏覽:30
韓式面部護理解壓視頻 瀏覽:301
pdf換成jpg圖片 瀏覽:897
dh加密演算法 瀏覽:107
安卓手機如何隱藏微信信息提示 瀏覽:632
nodejs解壓縮 瀏覽:262