2016-11-28 98 views
1

任何人都可以在java單例設計模式類vs java final類上清楚地解釋我。我們可以使用final類而不是使用singleton類,對於final類,我們可以創建類的實例並使用其中的方法,但不會覆蓋屬性,如果該方法在final類中是靜態的,我們可以調用像ClassName這樣的方法.getMethod,爲什麼我們要去單身人士而不是最後一班。java單例類vs最終類

+1

您不能擴展最終的類,但可以擴展單例類。 –

+1

這兩個概念是完全正交的。 – yshavit

+0

由於靜態變量不能被子類覆蓋,所以問題基本上歸結爲:爲什麼要使用單例而不是類的靜態變量!? – luk2302

回答

6

最後一類是無法擴展的類。您可以在最後一堂課中有任意數量的實例。最後一堂課的最佳例子是String。 Singleton是一個類的單個實例。所以兩者不完全相同,但是你可以讓你的單身類最終限制某人擴展它。

+0

如果執行得當,單身人士的班級無需爲了不被延伸而被宣佈爲最終決定。由於單例類的所有構造函數都是私有的,因此不能擴展該類。事實上,單身人士課程實際上是最終的。 –

1

單身人士是您的程序的所有生命都有一個單一實例的類。但是最後一堂課,你可以有多個實例。問題是你不能從最終的類繼承,但沒有任何東西阻止你擁有它的很多實例。

2

您不能擴展最終類,並且只有一個單例類的實例。所以繼承概念不適用於最終的類。但是你可以在最終課堂上創建任意數量的實例,但是你不能在Singleton中。

即,final類是不可變類,可以創建多個實例,但Singleton類只有單個實例。

0

單身人士課程通常與ClassLoader聯繫在一起。基本上,你應該有一個每個JVM。 A final類是你不能繼承的東西,但僅僅因爲它是final並不意味着你不能擁有它的多個實例(每個JVM)。

注意,當我說每個JVM我說的是,例如,一個.class文件中.war文件部署的一次;如果多次部署同一個Web應用程序,則每個應用程序都有自己的單身人員

-1

我認爲你的問題更多的是關於靜態與單身。因爲你不能重寫一個靜態方法,所以成爲最終的類在這種情況下是不相關的(你當然可以在擴展中定義相同的簽名靜態方法,但這將是無關緊要的,因爲綁定仍然是「靜態的」 SuperClass.getMethod將始終調用SuperClass中的定義)。這是一個經典問題,我相信你可以在別處找到答案。但是,爲了給你一個簡短的答案,我會說使用單例允許你實現接口並像任何其他對象一樣傳遞你的單例對象。或許我可以解釋一下,無論誰給我-1,我的意思是什麼(我認爲這足夠清楚)。最初的問題是關於單身vs最終。但是當他解釋時,他清楚地表明他將使用靜態方法。然後他並沒有意識到,使得這些方法屬於單一類的獨特之處在於它們是靜態的,而類方法而不是實例方法。作爲最後的決定並不會產生任何影響:用戶可以儘可能多地實例化它,這隻會阻止他擴展課程,這在我看來並不是誰問問題的真正關注點。另一方面,他明確表示他將在他的最後一堂課上使用靜態方法。這似乎表明他想通過使用靜態方法使其成爲一個單身人士:這是一種經典的做法,使用靜態方法與單例方式的問題之前已經提出過。例如,請參閱Why use a singleton instead of static methods?Difference between static class and singleton pattern? 當我編寫有關重寫靜態方法的內容時,我嘗試解釋靜態方法並未真正被覆蓋,因爲它們不涉及動態綁定。舉一個例子,如果你有一個靜態方法foo()的類A,然後B類繼承了A類並重新定義了靜態foo(),那沒問題。但是,如果在對象obj上調用foo(),將會調用屬於obj類型的靜態方法,即使在運行時爲其分配了不同的對象(這就是我所說的靜態綁定)。換句話說,如果你聲明「A obj = new B()」並調用obj.foo(),它仍然會調用A.foo() 我不知道這個解釋是否有用,我希望誰給了我-1解釋了原因。