我尝试使用 MapMaker/CacheBuilder 制作缓存,但我不明白如何正确处理空值。
ConcurrentMap<Key, Graph> graphs = new MapMaker()
.concurrencyLevel(4)
.weakKeys()
.maximumSize(10000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.makeComputingMap(
new Function<Key, Graph>() {
public Graph apply(Key key) {
return createExpensiveGraph(key);
}
});
如果 createExpensiveGraph 方法返回空值,则抛出 NullpointerException。 我不明白 ComputingConcurrentHashMap 为什么会抛出 NPE 而不是仅仅返回空值。
如何正确处理?只需捕获 NPE 并返回 null 吗? 我错过了什么吗?
最佳答案
Guava 试图强制您尽可能避免使用 null
,因为在存在 null
的情况下不正确或未记录的行为会导致大量困惑和错误。我认为尽可能避免使用空值绝对是一个好主意,如果您可以修改代码使其不使用 null
,我强烈建议您改用这种方法。
您问题的答案主要取决于“null”值在您的应用程序中的实际含义。最有可能的是,这意味着这个键“没有值(value)”,或者“什么都没有”。在这种情况下,您最好的选择可能是使用 Optional
,用 Optional
.of 包装非空值并使用 Optional.absent()
而不是 null
。如果必须将其转换为 null 或非 null 值,则可以使用 Optional.orNull()
。
关于java - 使用 Guava MapMaker/CacheBuilder 处理空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8298285/