1.Guava Cache的get/getIfPresent方法当参数为null时会抛空指针异常
我刚开始使用时还以为Guava Cache跟HashMap一样,get(null)返回null。
实际上Guava整体设计思想就是拒绝null的,很多地方都会执行com.google.common.base.Preconditions.checkNotNull的检查。
2.Guava Cache的load方法不能返回null,否则抛异常
Guava Cache的get方法先在本地缓存中取,如果不存在,则会触发load方法。但load方法不能返回null。
static Cache<String, Optional<Person>> secKillCache = CacheBuilder.newBuilder().maximumSize(600).expireAfterWrite(5, TimeUnit.SECONDS).build();
public static void main(String[] args) throws Exception{
DateUtil dateUtil = new DateUtil();
Optional<Person> optional = dateUtil.getPerson();
if(optional.isPresent()){
System.out.println(optional.get());
}
}
public Optional<Person> getPerson() throws ExecutionException{
try{
return secKillCache.get("test", new Callable<Optional<Person>>() {
@Override
public Optional<Person> call() throws Exception {
Person p = loadFromDatabase();
return Optional.fromNullable(p);
}
});
}catch (ExecutionException e){
throw e;
}
}
//假设数据库中不存在
public Person loadFromDatabase() {
return new Person("zhang", "123");
}
public Optional<Person> get(String key) {
try {
return secKillCache.getIfPresent(key);
} catch (Exception e) {
//log exception
}
return null;
}
class Person{
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
Person(String name, String password){
this.name = name;
this.password = password;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
guava
猜你喜欢
转载自qtlkw.iteye.com/blog/2394175
今日推荐
周排行