2015-12-21 66 views
0

在Java中,你可以創建這樣一個單:爲什麼讓單身的對象,而不是私人的公共

public class SingleObject { 

    //create an object of SingleObject 
    private static SingleObject instance = new SingleObject(); 

    //make the constructor private so that this class cannot be 
    //instantiated 
    private SingleObject(){} 

    //Get the only object available 
    public static SingleObject getInstance(){ 
     return instance; 
    } 
} 

是否有任何理由,你爲什麼就是不能讓實例公衆和免除的getInstance?

+2

有些人可以改變實例 - >不是單身了。 – SBI

+0

如果它的公共靜態,那麼它變成外部世界可訪問的類變量。如果它是唯一的public,那麼你不能在getInstance()中使用它。 – Shriram

+3

如果你想讓它成爲'public',那麼使用'final'。 – YoungHobbit

回答

1

Effective Java,約書亞布洛赫說上過public final領域的靜態工廠方法的優點是:

一個優點工廠法的方法之一是,它給你的靈活性 改變你的想法是否該類應該是一個沒有 更改其API的單例。工廠方法返回唯一的實例,但可以很容易地被修改爲返回,例如每個調用它的線程的唯一實例。

而且他還表示:

第二個優點,有關泛型類型,在第27項通常這些優勢都不是討論是相關的,以及最終場的方法更簡單。

否則在Java中,他寫道:「單元素枚舉類型是實現一個單身的最佳途徑」

// Enum singleton - the preferred approach 
public enum Elvis { 
    INSTANCE; 
    public void leaveTheBuilding() { ... } 
} 
3

現代(因爲Java 1.5的我認爲)規範的方法來創建Java,請從this answer shamlessly複製的,裏面有很多更多的背景和更大的示例單身,是這樣的,它取代了你的問題代碼:

public enum SingleObject { 
    INSTANCE; 
} 

直接回答你的問題:你問的是錯誤的問題,答案是,它不應該是你給出的選擇。

+4

我是否仍然不喜歡以這種方式使用'enum'?當然,我現在不會創建很多單身人士。 – crush

+0

@crush可能不是。不過,我認爲在這種情況下,權衡是值得使用關鍵字'enum'的混淆,任何替代方案都會變得更糟。 – hyde

+0

不是'enum'只是編譯成'public static SingleObject INSTANCE = new SingleObject()'(作爲'SingleObject'類的成員)?它似乎最多可以刪除一些非常簡單的樣板文件,同時使其不清楚結構起什麼作用並引入一些不需要的元數據'$ values' – crush

相關問題