当前位置: 首页 > 面试题库 >

Guava缓存并保留检查的异常

施振海
2023-03-14
问题内容

我正在重构一些代码以使用guava Cache。

初始代码:

public Post getPost(Integer key) throws SQLException, IOException {
    return PostsDB.findPostByID(key);
}

为了不破坏某些内容,我需要按原样保留任何引发的异常,而不用包装它。

当前的解决方案看起来有些难看:

public Post getPost(final Integer key) throws SQLException, IOException {
    try {
        return cache.get(key, new Callable<Post>() {
            @Override
            public Post call() throws Exception {
                return PostsDB.findPostByID(key);
            }
        });
    } catch (ExecutionException e) {
        Throwable cause = e.getCause();
        if (cause instanceof SQLException) {
            throw (SQLException) cause;
        } else if (cause instanceof IOException) {
            throw (IOException) cause;
        } else if (cause instanceof RuntimeException) {
            throw (RuntimeException) cause;
        } else if (cause instanceof Error) {
            throw (Error) cause;
        } else {
            throw new IllegalStateException(e);
        }
    }
}

有什么办法可以使它变得更好?


问题答案:

刚写完问题,就开始考虑使用泛型的效用方法。然后想起了Throwables的一些东西。是的,它已经在那里!)

可能还需要处理UncheckedExecutionException甚至ExecutionError。

因此解决方案是:

public Post getPost(final Integer key) throws SQLException, IOException {
    try {
        return cache.get(key, new Callable<Post>() {
            @Override
            public Post call() throws Exception {
                return PostsDB.findPostByID(key);
            }
        });
    } catch (ExecutionException e) {
        Throwables.propagateIfPossible(
            e.getCause(), SQLException.class, IOException.class);
        throw new IllegalStateException(e);
    } catch (UncheckedExecutionException e) {
        Throwables.throwIfUnchecked(e.getCause());
        throw new IllegalStateException(e);
    }
}

非常好!

另请参见ThrowablesExplained,LoadingCache.getUnchecked以及为什么我们不赞成Throwables.propagate的原因。



 类似资料:
  • 主要内容:1.Table - 双键Map,2.BiMap - 双向Map,3.Multimap - 多值Map,4.RangeMap - 范围Map,5.ClassToInstanceMap - 实例MapGuava是google公司开发的一款Java类库扩展工具包,内含了丰富的API,涵盖了集合、缓存、并发、I/O等多个方面。使用这些API一方面可以简化我们代码,使代码更为优雅,另一方面它补充了很多jdk中没有的功能,能让我们开发中更为高效。 1.Table - 双键Map java中的Map

  • 我有以下情况: null 请注意,许多服务访问用户存储库,因此在保存之前直接实现新逻辑是很麻烦的。 为了在保存/更新之前执行验证,而不必为每个保存/更新调用显式实现验证,我尝试使用JPA侦听器。使用和,我实现了在每次保存/更新之前执行验证的目标。但是,这种解决方案存在两个问题: 检查的异常不会在保存/更新用户的方法上强制执行,并且异常会通过侦听器自动包装为 当试图使用AOP捕获所述并解压缩原始检查

  • 主要内容:1 什么是Guava LoadingCache接口,2 Guava LoadingCache接口的语法,3 Guava LoadingCache接口的方法,5 Guava LoadingCache接口的例子1 什么是Guava LoadingCache接口 Guava 通过接口 LoadingCache<K,V> 提供了一个非常强大的基于内存的缓存机制。值会自动加载到缓存中,它提供了许多对缓存需求有用的实用方法。 2 Guava LoadingCache接口的语法 3 Guava Lo

  • Java8类型注释(JSR308)允许类型检查器执行静态代码分析。例如,检查器框架可以通过注释检查可能的空值。 各种项目都定义了自己的非空注释,例如: 等(参见《检查框架手册》第3.7节) 对于此类注释,我希望具有,因为它们通常在运行时不需要。最重要的是,代码对相应的库没有任何运行时依赖关系。 虽然遵循这种方法,但大多数其他的NonNull注释,如(JSR305)和本身,都具有。是否有任何特定的原

  • 我写了一份使用番石榴缓存的Flink作业。缓存对象是在main()函数中调用的run()函数中创建和使用的。 它类似于: 如果我以某种程度的并行性运行这个Flink作业,所有并行任务是否都将使用相同的缓存对象?如果没有,如何使它们都使用单个缓存? 缓存用于流的进程()函数内部。所以这就像 您可以将我的用例视为基于缓存的重复数据消除,因此我希望所有并行任务都指向单个缓存对象

  • 我知道stackoverflow上也有类似的问题,但在调查了其中几个之后,我知道 > 他们正在使用不同的存储格式 但这些并不是令人困惑的地方,我不知道什么时候该用一个,什么时候该用另一个。 考虑以下两种情况: 如果由于某种原因(例如错误修复或意外崩溃)需要关闭或重新启动整个应用程序,那么我必须使用保存点来恢复整个应用程序