亲宝软件园·资讯

展开

GuavaCache返回Null 浅谈Java中GuavaCache返回Null的注意事项

一灰灰 人气:2
想了解浅谈Java中GuavaCache返回Null的注意事项的相关内容吗,一灰灰在本文为您仔细讲解GuavaCache返回Null的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:GuavaCache返回Null,Guava,Cache,null,下面大家一起来学习吧。

Guava在实际的Java后端项目中应用的场景还是比较多的,比如限流,缓存,容器操作之类的,有挺多实用的工具类,这里记录一下,在使用GuavaCache,返回null的一个问题

I. 常见使用姿势

@Test
public void testGuava() {
    LoadingCache<String, String> cache = CacheBuilder.newBuilder().build(new CacheLoader<String, String>() {
        @Override
        public String load(String key) throws Exception {
            if ("hello".equals(key)) {
                return "word";
            }
            return null;
        }
    });

    String word = cache.getUnchecked("hello");
    System.out.println(word);

    System.out.println(cache.getUnchecked("word"));
}

上面是一个非常简单的测试case,需要注意的是,cache.get("word") 的执行,并不如逾期的返回的是null,而是会抛一个异常出来

word
com.google.common.cache.CacheLoader$InvalidCacheLoadException: CacheLoader returned null for key word.
 at com.google.common.cache.LocalCache$Segment.getAndRecordStats(LocalCache.java:2287)
...

从异常描述能看出,不允许返回null,这一块之前倒是没怎么注意,因此对于null的情况,要么定义一个标记表示不存在,要么在load()方法中主动抛一个异常出来,在使用的时候注意下,通过异常的使用方式,可以如下

public class NoVlaInGauvaException extends Exception {
    public NoVlaInGauvaException(String msg) {
        super(msg);
    }

    @Override
    public synchronized Throwable fillInStackTrace() {
        return this;
    }
}

说明:为什么重写fillInStackTrace方法

对于这种缓存未命中的情况下,一般而言是不需要关注完整的堆栈信息的,没有数据而已,可以节省一点点性能(当然除非是在高频率的抛出时,才会有表现症状)

其次就是get与getUnchecked的区别了

改造之后,我们的cache如下

LoadingCache<String, String> cache = CacheBuilder.newBuilder().build(new CacheLoader<String, String>() {
    @Override
    public String load(String key) throws Exception {
        if ("hello".equals(key)) {
            return "word";
        }
        throw new NoVlaInGauvaException();
    }
});

到此这篇关于浅谈Java中GuavaCache返回Null的注意事项的文章就介绍到这了,更多相关GuavaCache返回Null内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

加载全部内容

相关教程
猜你喜欢
用户评论