簡體   English   中英

單例還是靜態類?

[英]Singleton or static class?

我有以下課程:

public class EnteredValues {

private HashMap<String, String> mEnteredValues;

public boolean change = false;
public boolean submit = false;
private static final EnteredValues instance = new EnteredValues();

// Singleton
private EnteredValues() {
    mEnteredValues = new HashMap<String, String>();
}

public static EnteredValues getInstance() {
    return instance;
}

public void addValue(String id, String value) {

    if (mEnteredValues.put(id, value) != null) {
        // A change has happened
        change = true;
    }
}

public String getValueForIdentifier(String identifier) {
    return mEnteredValues.get(identifier);
}

public HashMap<String, String> getEnteredValues() {
    return mEnteredValues;
}

public void clean() {
    mEnteredValues.clear();
    change = false;
    submit = false;
}
}

該類用於管理用戶已經輸入的值,並且該類應可供應用程序中的所有類訪問。
當活動發生變化時,我通過調用clear方法來“重置”單例。

我選擇單例模式時並沒有真正考慮靜態類的選項。
但是現在我想知道是否不應該只使用靜態類。

處理只管理值的類的常用方法是什么? 靜態類作為單例更快嗎?

謝謝

您提供一種清晰的方法來重置Singleton狀態的事實表明,您不應使用Singleton。 由於國家是全球性的,因此這是冒險行為。 這也意味着單元測試將是一個很大的痛苦。

還有一件事。 永遠不要將實例變量聲明為公共變量。 將它們聲明為私有或受保護的,並提供獲取器和設置器。 同樣,也不需要使用默認值初始化實例變量。

靜態類和單例模式之間的主要區別在於,如果您需要實現接口等,則可以使用單例。 對於這種特殊情況,我認為使用靜態類可能會更好,因為您沒有實現任何接口。 關於您的問題是否可以更快地解決,我想說兩者之間的差異可以忽略不計,但是使用靜態類將減少類的動態實例化的少量開銷。

如果需要這樣的設計,使用單例有什么不好? 如果您只需要某個對象的一個​​實例來進行指定的操作,那么單例無疑是不錯的選擇。

@see Java靜態調用比非靜態調用昂貴還是便宜?

閱讀http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

從那里:

注意:靜態嵌套類與它的外部類(和其他類)的實例成員進行交互,就像其他任何頂級類一樣。 實際上,靜態嵌套類在行為上是頂級類,為了包裝方便,該頂級類已嵌套在另一個頂級類中。

只為風格

如果不需要,我寧願不依賴Singleton。 為什么? 凝聚力較小。 如果是可以從外部設置的屬性,則可以使用單元測試來測試“活動”(或其他任何內容)。 如果願意,您可以改變主意以使用不同的實例,依此類推。

我謙虛的建議是在每個Activity中都有一個屬性(也許您可以定義一個公共基類?),並使用新的新實例將其設置為Activity初始化。

您的代碼對如何獲取它一無所知(初始化代碼除外,也許您將來可以更改它)。

但是正如我所說的...只是一個口味問題! :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM