2013-02-04 90 views
0

我正在使用一個枚舉實現一副單身卡,這樣我就可以從程序中的任何地方對卡組進行普遍訪問。作爲枚舉的構造函數的一部分,它使用每張卡片對陣列列表進行混洗,並將它們全部推送到堆棧上(這看起來象徵性地合適)。何時調用枚舉構造函數?

什麼時候構造函數被調用?它是在運行時構建的嗎?編譯時間?我第一次打電話給枚舉?我是否可以期待每次運行程序時都會正確隨機化一副​​撲克牌?

謝謝!

+5

我建議您不要爲您描述的場景使用單例。 –

回答

2

你不應該使用單這一點。

但是爲了回答這個問題,當類加載器加載並初始化enum類(Deck)時調用構造函數。因此,在任何代碼行可以調用Deck類的任何方法之前,將洗牌。

+0

爲什麼我不應該爲此使用單身人士?這似乎是一個使用單身的合理地點。這是大多數類需要訪問的東西,而不是將每個類的構造函數的引用傳遞給每個類的構造函數(並且確保每個類都有一個指向它的指針),我只要每個類都引用單例就可以了需要它。 另外,我應該清楚:我沒有創造一個經典的撲克牌。我正在向Java移植棋盤遊戲,因此每張牌都是唯一的(每張牌都是另一種枚舉類型的一部分)。 – SirYancy

+1

一副牌不構成一個獨特的資源。我可以理解爲數據源創建單例。但是一副牌通常是你有幾個實例的東西。單身人士應該避免一般,因爲他們促進糟糕的設計(意大利麪條代碼),和難以單元測試(通過嘲笑甲板)的代碼。事實上,你的應用程序中有這麼多的類需要訪問該套牌,這表明該設計是完美的。 –

+1

這很有趣,我很新的編程,我做這個項目作爲一個學習項目。當我第一次遇到單身人士的想法時,並沒有提到他們是要避免的東西,所以我只是一個簡單的編程工具,並開始在各地實施它們。看到每個人對這個問題的回答後,我很驚訝地發現他們是一件壞事。很有意思。謝謝。 – SirYancy

2

我認爲你設計的方式是錯誤的。 enum表示不應該具有全局功能的一組有限值。它們只是常數,它們可以爲它們中的每一個提供功能,但更多的是不值得做的。

直接在枚舉構造函數中調用洗牌功能(,在任何情況下都要求每個常量爲)似乎不是正確的方法。

一個更好的解決辦法是有4個不同的類別,是這樣的:

enum Suit { 
    HEARTS, 
    CLUBS, 
    .. 
} 

enum Value { 
    ACE, 
    TWO, 
    .. 
} 

class Card { 
    Suit suit; 
    Value value; 
} 

class Deck { 
    List<Card> cards; 

    public void shuffle() { .. } 
} 
+1

在Java中,使用'Enum'是創建單例的首選方式。這就是說,我同意你的答案的其餘部分:不要使用單身。 –

0

對於每個枚舉類型,當Enum類按順序初次初始化時,調用構造函數。

相關問題