2014-02-08 48 views
0

我一直在經歷this tutorial,據我所知,單例類只能初始化一次。因此,我寫了下面的1行代碼:單例類不起作用

public synchronized static DefaultHttpClient getThreadSafeClient { 

    **System.out.println("this should only happen once!!");** 

然後我寫了下面的代碼行中我MainActivity的按鈕:

HttpClient httpclient = multithreaded_httpclient.getThreadSafeClient(); 
HttpClient httpclient1 = multithreaded_httpclient.getThreadSafeClient(); 

我然後按下按鈕多次讓我吃驚,我發現這在我的logcat:

這應該只發生一次 這應該只發生一次 這應該只發生一次 這應該只發生一次

我以爲singleton classe的方法只執行一次......這怎麼可能?

+0

這不是一個單身魔法,你必須*使它成爲一個單身人士。如果你反覆調用一個方法,它會被反覆執行。 –

回答

2

看起來有一個小的誤解與Singletons有關。

單身人士只能是初始化一次,這意味着它只能有一個實例。當然,每次調用它時都會執行靜態方法,但返回的實例始終是同一個。

+0

所以你的意思是說,不管你多少次調用它,只有一個連接到服務器將永遠......? – user3134565

+0

您提到的教程代碼中沒有連接,您的實際代碼可能會有所不同。事情總是和返回的DefaultHttpClient實例一樣。 –

1

概括地說,在單身模式是指:

  • 類的構造函數是私有
  • 您創建一個公共工廠方法,在這裏你照顧:
    • 如果是第一次請求實例時,請創建一個實例new YourClass()
    • 如果在先前調用中已創建實例,則不會創建新實例,而是返回前一個實例。

所以,當其他類需要一個類的實例,他們正在執行調用該工廠方法,因爲構造函數是私有的,並且該方法裏面,你寫的代碼,以確保有隻是一個例子。

就是這樣。由於只能創建一個對象,因此對象的所有可能實例都是相同的,但是無論調用多少次,對該對象的任何公共方法的任何調用都將正常執行。