2012-07-12 27 views
10

What is an efficient way to implement a singleton pattern in Java?問題中,最有效的答案是使用Enum來實現單身人士。處理必須繼承的單身人士

這很好,我理解的論據,分別語言優勢。

但是,我有一組類,它們定義了單例,但是需要擴展其他類,這對於枚舉方法是不可能的,因爲枚舉不能繼承的子類

約書亞·布洛克說,在他的幻燈片:

  • 但有一件事是失蹤,你不能擴展枚舉類型
    • 在大多數情況下,你不應該
    • 一引人注目的使用案例操作代碼

在大多數情況下,你不應該:有人可以詳細說明那?我已經實現了幾個servlet,並且它們擴展了HttpServlet,爲什麼它們不應該是單例?我只需要在我的應用程序中使用它們的一個實例。

+0

請你能解釋爲什麼你想要一個singleton servlet(導致這種選擇的約束是什麼)? – Romski 2012-07-12 14:20:22

+0

@Romski應用程序只需要這個servlet的一個實例。 – Mahoni 2012-07-12 14:36:25

+0

enum可以實現接口。這意味着您只有一個使用另一個類中定義的功能的實例。 – 2012-07-12 18:01:26

回答

7

Singleton類可以擴展其他類;實際上在Java中默認情況下它會擴展Object。然而,Josh指的是你不應該擴展一個Singleton類,因爲一旦你擴展它,就會有超過1個實例。

接聽評論:

實際上實施辛格爾頓最好的辦法是:

從有效的Java

// Singleton with static factory 
public class Elvis { 
private static final Elvis INSTANCE = new Elvis(); 
private Elvis() { ... } 
public static Elvis getInstance() { return INSTANCE; } 
public void leaveTheBuilding() { ... } 
} 

這裏貓王可以擴展其他類。

+0

這是如何幫助我用枚舉語言實現我的servlet?一個使用枚舉類型實現的Singleton類,**不能**擴展其他類。 – Mahoni 2012-07-12 13:46:06

+0

不,在線部分「Effective Java」對枚舉方法有所說明。 >>這種方法在功能上等同於公共字段方法,但它更簡潔,提供了免費的序列化機制,並提供了針對多個實例的鐵證保證,即使面對複雜的序列化或反射攻擊。雖然這種方法尚未被廣泛採用,但是**單元素枚舉類型是實現單例的最佳方式** << – Mahoni 2012-07-12 13:53:54

+2

也許我應該說,更好的方法之一。但對你而言,這將是最好的方式,因爲你想延長。 – user1168577 2012-07-12 13:56:46

1

Josh指的是擴展枚舉類型,而不是讓單例類型擴展別的東西。

+0

但是我不能用enum單例方式來實現我的servlet,因爲這樣它不能繼承'HttpServlet':'public enum MyServlet extends HttpServlet'是不允許的。我不想延長我的單身,我想讓我的單身延長另一個階級。 – Mahoni 2012-07-12 13:42:37

+0

是的,很清楚。我說的是Josh沒有在這個引用中解決這個問題;)很明顯,在這種情況下你不能使用枚舉成語,那麼問題是什麼? – 2012-07-12 14:11:08

3

您不應該關心您的servlet的實際實例 - 生命週期管理由servlet容器根據您已同意的Servlet規範合同來處理。如果將你的部分服務器端功能作爲一個單例實現是有意義的,那麼就按照你喜歡的方式進行操作,然後從你的servlet中使用它。

+0

這很有道理! – Mahoni 2012-07-12 13:47:01

+0

這個問題解決了我的問題,但由於我的問題更一般,我決定檢查另一個例外。不管怎麼說,還是要謝謝你! – Mahoni 2012-07-12 20:22:45