我遇到的一種常見模式是需要從數據庫刷新像List或HashMap這樣的集合,但不希望在刷新之間添加或從中刪除值。不可改變但可刷新的集合?
我最近在Google的Guava庫中發現了ImmutableList和ImmutableMap,我非常喜歡它。但我不能對這些類型執行「clearAll()」,也不能重新填充它們。但我喜歡他們是不可改變的。
因此,如果我想強制執行這種「只對數據庫進行可變刷新」的模式,那麼我想每次都必須使用volatile變量。還是有更好的模式?這也可以在多線程環境中,並且我會確保refresh()上沒有競爭條件。
public class MarketManager {
private volatile ImmutableList<Market> markets = null;
private MarketManager() {
}
public void refresh() {
marketList = //build a new immutable market list
}
public static MarketManager getInstance() {
MarketManager marketManager = new MarketManager();
marketManager.refresh();
return marketManager;
}
}
你可以使用'Collections.unmodifiableList()';從一個能夠覆蓋該列表的類中的方法返回它。 – fge 2014-10-29 16:52:01
但是如果我想要提高Guava實現的性能呢?我編寫的應用程序使用了大量的集合和大量的內存。 – tmn 2014-10-29 16:53:11
應該指出'Collections.unmodifiableFoos()'返回原始'foo'的不可變視圖,所以它們非常高效。 – Kayaman 2014-10-29 16:56:08