【问题标题】:Caching enum values [closed]缓存枚举值
【发布时间】:2021-07-31 19:52:30
【问题描述】:

我有更多带有一些值的枚举,我想问你有什么方法可以缓存枚举值:

例如:

public enum Animal {
Dog, Cat, Cow;

static Animal[] values;
static EnumSet<Animal> cachedAnimalsEnumSet;
static List<Animal> cachedAnimalsList;

static {
    values = values();
    cachedAnimalsEnumSet = EnumSet.allOf(Animal.class);
    cachedAnimalsList = Arrays.asList(Animal.values());
    }
}

最好的方法是: 值,cachedAnimalsEnumSet 还是 cachedAnimalsList ?

【问题讨论】:

  • 这取决于你想做什么,但cachedAnimalsEnumSet 可能是最好的解决方案。
  • 或者以上都不是。使用Animal.values() 有什么问题?当然,这取决于您需要它来做什么。例如。如果您确实需要SetList,并且您经常需要它,那么是的,也许创建一个全局可重用的是好的。只有您可以判断您的场景是否需要它。

标签: java caching enums enumset


【解决方案1】:

假设您缓存的目的是避免每次有人调用 Animal.values() 时都创建新数组,而是只使用缓存的值。我推荐使用 EnumSet 的原因如下:

  1. 所有基本操作都是常数时间。
  2. 缓存重复的枚举值没有意义,Set 实现会为您处理。

但是,需要考虑的几件事是 EnumSet 中不允许空值(非常怀疑您是否要缓存空值)。第二件要小心的是 EnumSet 不同步。因此,如果您要进行多线程访问,并修改此缓存,则必须使用 Collections.synchronizedSet 方法对其进行包装。

【讨论】:

  • 1) 所有操作都是常数时间?如果不是一个集合,什么操作不会是?包含? Contains 总是返回 true,那么我们为什么需要这个调用呢? 毫无意义的理由。 --- 2) 没有重复?集合/列表是从values() 构建的这一事实确保了这一点。 毫无意义的理由。 --- 3) 不同步?你为什么需要那个。更重要的是使它们不可变,因为它们是全球共享的,因此同步成为一个有争议的问题。
  • 感谢您的回答!那么你认为最高效的方法是 EnumSet 吗?
  • OP 没有说明它们的整个用例,因此可能会对缓存进行修改。这就是为什么我提到如果涉及多个线程使其同步将是一个好习惯。
  • 此外,添加/删除操作(将被调用)在 EnumSet 中也是常数时间,因为它由位数组支持,并且在内存使用方面也更好,因为支持位数组具有预定义的大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 2016-11-10
  • 1970-01-01
  • 2015-02-12
相关资源
最近更新 更多