guava

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);
        }
    }

猜你喜欢

转载自qtlkw.iteye.com/blog/2394175