java - 使用 Guava MapMaker/CacheBuilder 处理空值

标签 java guava

我尝试使用 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/

相关文章:

java - 来自 Guava 或 Java 枚举的 ImmutableSet

java - directExecutor的优点

java - DynamoDB POJO 是否需要实现序列化?

java - 当我尝试使用具有相同名称和参数类型的两个方法时,为什么会出现编译错误?

guava - 无法解析导入 com.google.common.hash

caching - Guava 缓存 'expireAfterWrite' 似乎并不总是有效

java - 如何扩展 AbstractScheduledService.Scheduler

java - eclipse插件: set view name by ID programatically

java - 使用 apache tika Parser 对象解析 .doc 和 .docx 文件格式的问题

java - 在 JSP 中,path 和 value 属性在 input 标记中有什么作用,表单前缀如何影响它们?