-2

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

例如:

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?

4

1 回答 1

-2

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

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

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

于 2021-07-31T20:26:17.297 回答