我遇到的一个常见模式是需要从数据库中刷新 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()
:
public class MarketManager {
private volatile List<Market> markets = Collections.emptyList();
private MarketManager() {
}
public void refresh() {
marketList = //build a new market list
}
public List<Market> getMarkets() {
return Collections.unmodifiableList(markets);
}
// ...
}
Collections.unmodifiableList()
简单地包装了任何 List
实现,以便所有变异操作都被“禁用”(也就是说,它们抛出异常)。
关于java - 不可变但可刷新的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26636178/