首页>>后端>>java->GuavaCache返回Null的注意事项

GuavaCache返回Null的注意事项

时间:2023-12-01 本站 点击:0

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

I. 常见使用姿势

@TestpublicvoidtestGuava(){LoadingCache<String,String>cache=CacheBuilder.newBuilder().build(newCacheLoader<String,String>(){@OverridepublicStringload(Stringkey)throwsException{if("hello".equals(key)){return"word";}returnnull;}});Stringword=cache.getUnchecked("hello");System.out.println(word);System.out.println(cache.getUnchecked("word"));}

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

wordcom.google.common.cache.CacheLoader$InvalidCacheLoadException:CacheLoaderreturnednullforkeyword.atcom.google.common.cache.LocalCache$Segment.getAndRecordStats(LocalCache.java:2287)...

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

publicclassNoVlaInGauvaExceptionextendsException{publicNoVlaInGauvaException(Stringmsg){super(msg);}@OverridepublicsynchronizedThrowablefillInStackTrace(){returnthis;}}

说明:为什么重写fillInStackTrace方法

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

其次就是getgetUnchecked的区别了

get要求显示处理exception状况

getUnchecked 一般是可确认不会有问题的场景,直接调用

改造之后,我们的cache如下

LoadingCache<String,String>cache=CacheBuilder.newBuilder().build(newCacheLoader<String,String>(){@OverridepublicStringload(Stringkey)throwsException{if("hello".equals(key)){return"word";}thrownewNoVlaInGauvaException();}});

公众号:一灰灰blog


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/java/5515.html