2014-07-16 22 views
1

我已經實現了一個java單例類使用枚舉方法。該類的代碼如下所示。java - 從基於枚舉的單例類中分離業務邏輯

我的問題是:我如何將業務邏輯從這個單例類中分離出來,或者分開除了創建單例類之外的其他函數?

既然現在我已經把整個類聲明爲一個枚舉,我應該聲明它爲一個類,然後在裏面創建一個枚舉屬性或採取另一種方法?

這是我的單身代碼。

enum TransactionHelper implements ISerialize 
{ 
    Instance; 

    private int serializePreFixCount = 1; 

    /** 
    * This method serializes transaction on Disk. 
    */ 
    @Override 
    public void serializeOnDisk() 
    { 
    //some code here 

    } 

    /** 
    * This method serializes transaction on network stream. 
    */ 
    @Override 
    public void serializeOnNetwork() 
    { 
    //some code here 
    } 

} 

當我需要使用這個類時,我使用它。

TransactionHelper.Instance.serializeOnNetwork(); 
TransactionHelper.Instance.serializeOnDisk(); 

謝謝。

+0

「我如何將業務邏輯從這個單例中分離出來?」 - 假設它處理單身 - 你不! – alfasin

+0

爲什麼單身?具體來說,如果foo和bar都有不同的'TransactionHelper'實例,會發生什麼?請解釋,或給堆棧跟蹤,顯示錯誤。 – Thufir

+0

singelton應該只允許您創建一個對象。不管foo和bar是否自己實例化,它們仍然具有相同的對象。 – user3836750

回答

1

要分離業務邏輯,您應該使用object composition

enum TransactionHelper implements ISerialize { 

    Instance(new SerializeImpl()); 

    private int serializePreFixCount = 1; 
    private final ISerialize delegate; 

    /** 
    * Constructor 
    */ 
    TransactionHelper(ISerialize delegate) { 
     this.delegate = delegate; 
    } 

    /** 
    * This method serializes transaction on Disk. 
    */ 
    @Override 
    public void serializeOnDisk() { 
     delegate.serializeOnDisk(); 
    } 

    /** 
    * This method serializes transaction on network stream. 
    */ 
    @Override 
    public void serializeOnNetwork() { 
     delegate.serializeOnNetwork(); 
    } 

} 

現在,你可以把所有的序列化邏輯SerializeImpl類。


此外,您還可以使用枚舉代替使用一個類,如果你不介意從

TransactionHelper.Instance.serializeOnNetwork(); 
TransactionHelper.Instance.serializeOnDisk(); 

改變用法

TransactionHelper.getInstance().serializeOnNetwork(); 
TransactionHelper.getInstance().serializeOnDisk(); 

所以,才使構造私人,你可以得到你的單身人士

class TransactionHelper { 

    private TransactionHelper() { } 

    private static TransactionHelper getInstance() { 
     TransactionHelperHolder.INSTANCE; 
    } 

    private static class TransactionHelperHolder { 
     private static final TransactionHelper INSTANCE = new TransactionHelper(); 
    } 
} 

希望這會有所幫助。

+0

非常感謝。讓我在實際中查看它,然後我會回覆你 – user3836750

+0

我已經實現了它,但是有一個設計問題,如果我將所有序列化邏輯放入** SerializeImpl **類中,那麼我必須將其構造函數公開。那麼這意味着任何其他類都可以實例化該類。但在我的情況下,我不希望任何類調用序列化方法。 – user3836750

+0

你可以把它封裝成私人的。您自己的軟件包中的類可以始終遵循該規範。否則,你不應該完全委託並且擁有同一班級的所有內容。 –