gpt4 book ai didi

java - JCache 创建缓存,其中保存每个键的项目列表(泛型)

转载 作者:行者123 更新时间:2023-11-30 01:46:42 24 4
gpt4 key购买 nike

我想要一个保存项目列表的缓存。这是我的 bean 定义:

public Cache<Integer, List<Application>> getMyCacheManager(CacheManager manager) {
Cache<Integer, List<Application>> cache = manager.getCache("myCache");
if (Objects.isNull(cache)) {
var config = new MutableConfiguration<Integer, List<Application>>()
.setTypes(Integer.class, List.class)
.setStoreByValue(false)
.setStatisticsEnabled(true)
.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(TimeUnit.MILLISECONDS, myCacheExpiry)));
cache = manager.createCache("myCache", config);
}
return cache;
}

问题是.setTypes线。这里你必须指定缓存的键和值类型。 key 很简单,但值是 List<Application>类型。你不能只说:List<Application>.class ,因为这是不允许的。而且你也不能使用List.class ,因为编译器提示类型不兼容。

我真的很想保留特定类型(例如 List<Application> ),因为否则我每次都必须从 Object 转换值到正确的类型。

有什么想法吗?

最佳答案

JSR107/JCache 规范尝试将类型合并到配置中。对于集合类型,这会导致像您一样的困惑。

不幸的是,您需要将强制转换添加到您想要使用的正确类型。编译器禁止直接转换,因此您需要先转换为 Object 或只是 Cache

public Cache<Integer, List<Application>> getMyCacheManager(CacheManager manager) {
Cache<Integer, List<Application>> cache = manager.getCache("myCache");
if (Objects.isNull(cache)) {
var config = new MutableConfiguration<Integer, List<Application>>()
.setTypes(Integer.class, List.class)
.setStoreByValue(false)
.setStatisticsEnabled(true)
.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(TimeUnit.MILLISECONDS, myCacheExpiry)));
cache = (Cache<Integer, List<Application>>) ((Object) manager.createCache("myCache", config));
}
return cache;
}

缓存可能会检查类型或利用您提供的类型信息来进行一些优化。例如。 cache2k会优化整数键并将键存储为原始类型,而不是对象。

缓存内的显式类型检查不是 JSR107 规范的一部分。这意味着,使用不同的 JCache 实现,无论您在配置中指定什么,您都可能会也可能不会存储任何类型的对象。通常,按引用存储缓存 (setStoreByValue(false)) 无需额外检查即可存储任何对象引用。后者只是不必要的开销。

JSR107 的某些部分确实谈到了运行时类型检查。这样做的目的是确保缓存管理器返回类型兼容的缓存,而不是强制只有指定类型的对象进入缓存。严格的类型检查在服务版本中被删除,因为事实证明它不切实际。相关讨论位于:https://github.com/jsr107/jsr107spec/issues/340

关于java - JCache 创建缓存,其中保存每个键的项目列表(泛型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57685127/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com